• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.tv.util;
18 
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.media.tv.TvTrackInfo;
22 import android.preference.PreferenceManager;
23 import android.support.annotation.IntDef;
24 
25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 import java.util.Collections;
28 import java.util.HashSet;
29 import java.util.Set;
30 
31 /**
32  * A class about the constants for TV settings.
33  * Objects that are returned from the various {@code get} methods must be treated as immutable.
34  */
35 public final class TvSettings {
36     public static final String PREF_DISPLAY_MODE = "display_mode";  // int value
37     public static final String PREF_PIN = "pin"; // 4-digit string value. Otherwise, it's not set.
38 
39     // Multi-track audio settings
40     private static final String PREF_MULTI_AUDIO_ID = "pref.multi_audio_id";
41     private static final String PREF_MULTI_AUDIO_LANGUAGE = "pref.multi_audio_language";
42     private static final String PREF_MULTI_AUDIO_CHANNEL_COUNT = "pref.multi_audio_channel_count";
43 
44     // DVR Multi-audio and subtitle settings
45     private static final String PREF_DVR_MULTI_AUDIO_ID = "pref.dvr_multi_audio_id";
46     private static final String PREF_DVR_MULTI_AUDIO_LANGUAGE = "pref.dvr_multi_audio_language";
47     private static final String PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT =
48             "pref.dvr_multi_audio_channel_count";
49     private static final String PREF_DVR_SUBTITLE_ID = "pref.dvr_subtitle_id";
50     private static final String PREF_DVR_SUBTITLE_LANGUAGE = "pref.dvr_subtitle_language";
51 
52     // Parental Control settings
53     private static final String PREF_CONTENT_RATING_SYSTEMS = "pref.content_rating_systems";
54     private static final String PREF_CONTENT_RATING_LEVEL = "pref.content_rating_level";
55     private static final String PREF_DISABLE_PIN_UNTIL = "pref.disable_pin_until";
56 
57     @Retention(RetentionPolicy.SOURCE)
58     @IntDef({
59             CONTENT_RATING_LEVEL_NONE, CONTENT_RATING_LEVEL_HIGH, CONTENT_RATING_LEVEL_MEDIUM,
60             CONTENT_RATING_LEVEL_LOW, CONTENT_RATING_LEVEL_CUSTOM })
61     public @interface ContentRatingLevel {}
62     public static final int CONTENT_RATING_LEVEL_NONE = 0;
63     public static final int CONTENT_RATING_LEVEL_HIGH = 1;
64     public static final int CONTENT_RATING_LEVEL_MEDIUM = 2;
65     public static final int CONTENT_RATING_LEVEL_LOW = 3;
66     public static final int CONTENT_RATING_LEVEL_CUSTOM = 4;
67 
TvSettings()68     private TvSettings() {}
69 
70     // Multi-track audio settings
getMultiAudioId(Context context)71     public static String getMultiAudioId(Context context) {
72         return PreferenceManager.getDefaultSharedPreferences(context).getString(
73                 PREF_MULTI_AUDIO_ID, null);
74     }
75 
setMultiAudioId(Context context, String language)76     public static void setMultiAudioId(Context context, String language) {
77         PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
78                 PREF_MULTI_AUDIO_ID, language).apply();
79     }
80 
getMultiAudioLanguage(Context context)81     public static String getMultiAudioLanguage(Context context) {
82         return PreferenceManager.getDefaultSharedPreferences(context).getString(
83                 PREF_MULTI_AUDIO_LANGUAGE, null);
84     }
85 
setMultiAudioLanguage(Context context, String language)86     public static void setMultiAudioLanguage(Context context, String language) {
87         PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
88                 PREF_MULTI_AUDIO_LANGUAGE, language).apply();
89     }
90 
getMultiAudioChannelCount(Context context)91     public static int getMultiAudioChannelCount(Context context) {
92         return PreferenceManager.getDefaultSharedPreferences(context).getInt(
93                 PREF_MULTI_AUDIO_CHANNEL_COUNT, 0);
94     }
95 
setMultiAudioChannelCount(Context context, int channelCount)96     public static void setMultiAudioChannelCount(Context context, int channelCount) {
97         PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
98                 PREF_MULTI_AUDIO_CHANNEL_COUNT, channelCount).apply();
99     }
100 
setDvrPlaybackTrackSettings(Context context, int trackType, TvTrackInfo info)101     public static void setDvrPlaybackTrackSettings(Context context, int trackType,
102             TvTrackInfo info) {
103         if (trackType == TvTrackInfo.TYPE_AUDIO) {
104             if (info == null) {
105                 PreferenceManager.getDefaultSharedPreferences(context).edit()
106                         .remove(PREF_DVR_MULTI_AUDIO_ID).apply();
107             } else {
108                 PreferenceManager.getDefaultSharedPreferences(context).edit()
109                         .putString(PREF_DVR_MULTI_AUDIO_LANGUAGE, info.getLanguage())
110                         .putInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, info.getAudioChannelCount())
111                         .putString(PREF_DVR_MULTI_AUDIO_ID, info.getId()).apply();
112             }
113         } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
114             if (info == null) {
115                 PreferenceManager.getDefaultSharedPreferences(context).edit()
116                         .remove(PREF_DVR_SUBTITLE_ID).apply();
117             } else {
118                 PreferenceManager.getDefaultSharedPreferences(context).edit()
119                         .putString(PREF_DVR_SUBTITLE_LANGUAGE, info.getLanguage())
120                         .putString(PREF_DVR_SUBTITLE_ID, info.getId()).apply();
121             }
122         }
123     }
124 
getDvrPlaybackTrackSettings(Context context, int trackType)125     public static TvTrackInfo getDvrPlaybackTrackSettings(Context context,
126             int trackType) {
127         String language;
128         String trackId;
129         int channelCount;
130         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
131         if (trackType == TvTrackInfo.TYPE_AUDIO) {
132             trackId = pref.getString(PREF_DVR_MULTI_AUDIO_ID, null);
133             if (trackId == null) {
134                 return null;
135             }
136             language = pref.getString(PREF_DVR_MULTI_AUDIO_LANGUAGE, null);
137             channelCount = pref.getInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, 0);
138             return new TvTrackInfo.Builder(trackType, trackId)
139                     .setLanguage(language).setAudioChannelCount(channelCount).build();
140         } else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
141             trackId = pref.getString(PREF_DVR_SUBTITLE_ID, null);
142             if (trackId == null) {
143                 return null;
144             }
145             language = pref.getString(PREF_DVR_SUBTITLE_LANGUAGE, null);
146             return new TvTrackInfo.Builder(trackType, trackId).setLanguage(language).build();
147         } else {
148             return null;
149         }
150     }
151 
152     // Parental Control settings
addContentRatingSystem(Context context, String id)153     public static void addContentRatingSystem(Context context, String id) {
154         Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
155         if (contentRatingSystemSet.add(id)) {
156             PreferenceManager.getDefaultSharedPreferences(context).edit()
157                     .putStringSet(PREF_CONTENT_RATING_SYSTEMS, contentRatingSystemSet).apply();
158         }
159     }
160 
removeContentRatingSystem(Context context, String id)161     public static void removeContentRatingSystem(Context context, String id) {
162         Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
163         if (contentRatingSystemSet.remove(id)) {
164             PreferenceManager.getDefaultSharedPreferences(context).edit()
165                     .putStringSet(PREF_CONTENT_RATING_SYSTEMS, contentRatingSystemSet).apply();
166         }
167     }
168 
hasContentRatingSystem(Context context, String id)169     public static boolean hasContentRatingSystem(Context context, String id) {
170         return getContentRatingSystemSet(context).contains(id);
171     }
172 
173     /**
174      * Returns whether the content rating system is ever set. Returns {@code false} only when the
175      * user changes parental control settings for the first time.
176      */
isContentRatingSystemSet(Context context)177     public static boolean isContentRatingSystemSet(Context context) {
178         return PreferenceManager.getDefaultSharedPreferences(context)
179                 .getStringSet(PREF_CONTENT_RATING_SYSTEMS, null) != null;
180     }
181 
getContentRatingSystemSet(Context context)182     private static Set<String> getContentRatingSystemSet(Context context) {
183         return new HashSet<>(PreferenceManager.getDefaultSharedPreferences(context)
184                 .getStringSet(PREF_CONTENT_RATING_SYSTEMS, Collections.emptySet()));
185     }
186 
187     @ContentRatingLevel
188     @SuppressWarnings("ResourceType")
getContentRatingLevel(Context context)189     public static int getContentRatingLevel(Context context) {
190         return PreferenceManager.getDefaultSharedPreferences(context).getInt(
191                 PREF_CONTENT_RATING_LEVEL, CONTENT_RATING_LEVEL_NONE);
192     }
193 
setContentRatingLevel(Context context, @ContentRatingLevel int level)194     public static void setContentRatingLevel(Context context,
195             @ContentRatingLevel int level) {
196         PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
197                 PREF_CONTENT_RATING_LEVEL, level).apply();
198     }
199 
200     /**
201      * Returns the time until we should disable the PIN dialog (because the user input wrong PINs
202      * repeatedly).
203      */
getDisablePinUntil(Context context)204     public static long getDisablePinUntil(Context context) {
205         return PreferenceManager.getDefaultSharedPreferences(context).getLong(
206                 PREF_DISABLE_PIN_UNTIL, 0);
207     }
208 
209     /**
210      * Saves the time until we should disable the PIN dialog (because the user input wrong PINs
211      * repeatedly).
212      */
setDisablePinUntil(Context context, long timeMillis)213     public static void setDisablePinUntil(Context context, long timeMillis) {
214         PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(
215                 PREF_DISABLE_PIN_UNTIL, timeMillis).apply();
216     }
217 }