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