blob: c5fde317091658064c5c4a8fa15f840e86574242 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.tv.TvTrackInfo;
import android.preference.PreferenceManager;
import android.support.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* A class about the constants for TV settings.
* Objects that are returned from the various {@code get} methods must be treated as immutable.
*/
public final class TvSettings {
public static final String PREF_DISPLAY_MODE = "display_mode"; // int value
public static final String PREF_PIN = "pin"; // 4-digit string value. Otherwise, it's not set.
// Multi-track audio settings
private static final String PREF_MULTI_AUDIO_ID = "pref.multi_audio_id";
private static final String PREF_MULTI_AUDIO_LANGUAGE = "pref.multi_audio_language";
private static final String PREF_MULTI_AUDIO_CHANNEL_COUNT = "pref.multi_audio_channel_count";
// DVR Multi-audio and subtitle settings
private static final String PREF_DVR_MULTI_AUDIO_ID = "pref.dvr_multi_audio_id";
private static final String PREF_DVR_MULTI_AUDIO_LANGUAGE = "pref.dvr_multi_audio_language";
private static final String PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT =
"pref.dvr_multi_audio_channel_count";
private static final String PREF_DVR_SUBTITLE_ID = "pref.dvr_subtitle_id";
private static final String PREF_DVR_SUBTITLE_LANGUAGE = "pref.dvr_subtitle_language";
// Parental Control settings
private static final String PREF_CONTENT_RATING_SYSTEMS = "pref.content_rating_systems";
private static final String PREF_CONTENT_RATING_LEVEL = "pref.content_rating_level";
private static final String PREF_DISABLE_PIN_UNTIL = "pref.disable_pin_until";
@Retention(RetentionPolicy.SOURCE)
@IntDef({
CONTENT_RATING_LEVEL_NONE, CONTENT_RATING_LEVEL_HIGH, CONTENT_RATING_LEVEL_MEDIUM,
CONTENT_RATING_LEVEL_LOW, CONTENT_RATING_LEVEL_CUSTOM })
public @interface ContentRatingLevel {}
public static final int CONTENT_RATING_LEVEL_NONE = 0;
public static final int CONTENT_RATING_LEVEL_HIGH = 1;
public static final int CONTENT_RATING_LEVEL_MEDIUM = 2;
public static final int CONTENT_RATING_LEVEL_LOW = 3;
public static final int CONTENT_RATING_LEVEL_CUSTOM = 4;
private TvSettings() {}
// Multi-track audio settings
public static String getMultiAudioId(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString(
PREF_MULTI_AUDIO_ID, null);
}
public static void setMultiAudioId(Context context, String language) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
PREF_MULTI_AUDIO_ID, language).apply();
}
public static String getMultiAudioLanguage(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString(
PREF_MULTI_AUDIO_LANGUAGE, null);
}
public static void setMultiAudioLanguage(Context context, String language) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
PREF_MULTI_AUDIO_LANGUAGE, language).apply();
}
public static int getMultiAudioChannelCount(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
PREF_MULTI_AUDIO_CHANNEL_COUNT, 0);
}
public static void setMultiAudioChannelCount(Context context, int channelCount) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
PREF_MULTI_AUDIO_CHANNEL_COUNT, channelCount).apply();
}
public static void setDvrPlaybackTrackSettings(Context context, int trackType,
TvTrackInfo info) {
if (trackType == TvTrackInfo.TYPE_AUDIO) {
if (info == null) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.remove(PREF_DVR_MULTI_AUDIO_ID).apply();
} else {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString(PREF_DVR_MULTI_AUDIO_LANGUAGE, info.getLanguage())
.putInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, info.getAudioChannelCount())
.putString(PREF_DVR_MULTI_AUDIO_ID, info.getId()).apply();
}
} else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
if (info == null) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.remove(PREF_DVR_SUBTITLE_ID).apply();
} else {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString(PREF_DVR_SUBTITLE_LANGUAGE, info.getLanguage())
.putString(PREF_DVR_SUBTITLE_ID, info.getId()).apply();
}
}
}
public static TvTrackInfo getDvrPlaybackTrackSettings(Context context,
int trackType) {
String language;
String trackId;
int channelCount;
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
if (trackType == TvTrackInfo.TYPE_AUDIO) {
trackId = pref.getString(PREF_DVR_MULTI_AUDIO_ID, null);
if (trackId == null) {
return null;
}
language = pref.getString(PREF_DVR_MULTI_AUDIO_LANGUAGE, null);
channelCount = pref.getInt(PREF_DVR_MULTI_AUDIO_CHANNEL_COUNT, 0);
return new TvTrackInfo.Builder(trackType, trackId)
.setLanguage(language).setAudioChannelCount(channelCount).build();
} else if (trackType == TvTrackInfo.TYPE_SUBTITLE) {
trackId = pref.getString(PREF_DVR_SUBTITLE_ID, null);
if (trackId == null) {
return null;
}
language = pref.getString(PREF_DVR_SUBTITLE_LANGUAGE, null);
return new TvTrackInfo.Builder(trackType, trackId).setLanguage(language).build();
} else {
return null;
}
}
// Parental Control settings
public static void addContentRatingSystem(Context context, String id) {
Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
if (contentRatingSystemSet.add(id)) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putStringSet(PREF_CONTENT_RATING_SYSTEMS, contentRatingSystemSet).apply();
}
}
public static void removeContentRatingSystem(Context context, String id) {
Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
if (contentRatingSystemSet.remove(id)) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putStringSet(PREF_CONTENT_RATING_SYSTEMS, contentRatingSystemSet).apply();
}
}
public static boolean hasContentRatingSystem(Context context, String id) {
return getContentRatingSystemSet(context).contains(id);
}
/**
* Returns whether the content rating system is ever set. Returns {@code false} only when the
* user changes parental control settings for the first time.
*/
public static boolean isContentRatingSystemSet(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context)
.getStringSet(PREF_CONTENT_RATING_SYSTEMS, null) != null;
}
private static Set<String> getContentRatingSystemSet(Context context) {
return new HashSet<>(PreferenceManager.getDefaultSharedPreferences(context)
.getStringSet(PREF_CONTENT_RATING_SYSTEMS, Collections.emptySet()));
}
@ContentRatingLevel
@SuppressWarnings("ResourceType")
public static int getContentRatingLevel(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
PREF_CONTENT_RATING_LEVEL, CONTENT_RATING_LEVEL_NONE);
}
public static void setContentRatingLevel(Context context,
@ContentRatingLevel int level) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
PREF_CONTENT_RATING_LEVEL, level).apply();
}
/**
* Returns the time until we should disable the PIN dialog (because the user input wrong PINs
* repeatedly).
*/
public static long getDisablePinUntil(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getLong(
PREF_DISABLE_PIN_UNTIL, 0);
}
/**
* Saves the time until we should disable the PIN dialog (because the user input wrong PINs
* repeatedly).
*/
public static void setDisablePinUntil(Context context, long timeMillis) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(
PREF_DISABLE_PIN_UNTIL, timeMillis).apply();
}
}