blob: 97ff59d6b26da059e57b8a45cb8042dd8e9f9d8d [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.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 {
private TvSettings() {}
public static final String PREF_DISPLAY_MODE = "display_mode"; // int value
public static final String PREF_PIP_LAYOUT = "pip_layout"; // int value
public static final String PREF_PIP_SIZE = "pip_size"; // int value
public static final String PREF_PIN = "pin"; // 4-digit string value. Otherwise, it's not set.
// PIP sounds
@Retention(RetentionPolicy.SOURCE)
@IntDef({
PIP_SOUND_MAIN, PIP_SOUND_PIP_WINDOW })
public @interface PipSound {}
public static final int PIP_SOUND_MAIN = 0;
public static final int PIP_SOUND_PIP_WINDOW = PIP_SOUND_MAIN + 1;
// PIP layouts
@Retention(RetentionPolicy.SOURCE)
@IntDef({
PIP_LAYOUT_BOTTOM_RIGHT, PIP_LAYOUT_TOP_RIGHT, PIP_LAYOUT_TOP_LEFT,
PIP_LAYOUT_BOTTOM_LEFT, PIP_LAYOUT_SIDE_BY_SIDE })
public @interface PipLayout {}
public static final int PIP_LAYOUT_BOTTOM_RIGHT = 0;
public static final int PIP_LAYOUT_TOP_RIGHT = PIP_LAYOUT_BOTTOM_RIGHT + 1;
public static final int PIP_LAYOUT_TOP_LEFT = PIP_LAYOUT_TOP_RIGHT + 1;
public static final int PIP_LAYOUT_BOTTOM_LEFT = PIP_LAYOUT_TOP_LEFT + 1;
public static final int PIP_LAYOUT_SIDE_BY_SIDE = PIP_LAYOUT_BOTTOM_LEFT + 1;
public static final int PIP_LAYOUT_LAST = PIP_LAYOUT_SIDE_BY_SIDE;
// PIP sizes
@Retention(RetentionPolicy.SOURCE)
@IntDef({ PIP_SIZE_SMALL, PIP_SIZE_BIG })
public @interface PipSize {}
public static final int PIP_SIZE_SMALL = 0;
public static final int PIP_SIZE_BIG = PIP_SIZE_SMALL + 1;
public static final int PIP_SIZE_LAST = PIP_SIZE_BIG;
// 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";
// 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;
// PIP settings
/**
* Returns the layout of the PIP window stored in the shared preferences.
*
* @return the saved layout of the PIP window. This value is one of
* {@link #PIP_LAYOUT_TOP_LEFT}, {@link #PIP_LAYOUT_TOP_RIGHT},
* {@link #PIP_LAYOUT_BOTTOM_LEFT}, {@link #PIP_LAYOUT_BOTTOM_RIGHT} and
* {@link #PIP_LAYOUT_SIDE_BY_SIDE}. If the preference value does not exist,
* {@link #PIP_LAYOUT_BOTTOM_RIGHT} is returned.
*/
@SuppressWarnings("ResourceType")
@PipLayout
public static int getPipLayout(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
PREF_PIP_LAYOUT, PIP_LAYOUT_BOTTOM_RIGHT);
}
/**
* Stores the layout of PIP window to the shared preferences.
*
* @param pipLayout This value should be one of {@link #PIP_LAYOUT_TOP_LEFT},
* {@link #PIP_LAYOUT_TOP_RIGHT}, {@link #PIP_LAYOUT_BOTTOM_LEFT},
* {@link #PIP_LAYOUT_BOTTOM_RIGHT} and {@link #PIP_LAYOUT_SIDE_BY_SIDE}.
*/
public static void setPipLayout(Context context, @PipLayout int pipLayout) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
PREF_PIP_LAYOUT, pipLayout).apply();
}
/**
* Returns the size of the PIP view stored in the shared preferences.
*
* @return the saved size of the PIP view. This value is one of
* {@link #PIP_SIZE_SMALL} and {@link #PIP_SIZE_BIG}. If the preference value does not
* exist, {@link #PIP_SIZE_SMALL} is returned.
*/
@SuppressWarnings("ResourceType")
@PipSize
public static int getPipSize(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getInt(
PREF_PIP_SIZE, PIP_SIZE_SMALL);
}
/**
* Stores the size of PIP view to the shared preferences.
*
* @param pipSize This value should be one of {@link #PIP_SIZE_SMALL} and {@link #PIP_SIZE_BIG}.
*/
public static void setPipSize(Context context, @PipSize int pipSize) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(
PREF_PIP_SIZE, pipSize).apply();
}
// 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();
}
// Parental Control settings
public static void addContentRatingSystems(Context context, Set<String> ids) {
Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
if (contentRatingSystemSet.addAll(ids)) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putStringSet(PREF_CONTENT_RATING_SYSTEMS, contentRatingSystemSet).apply();
}
}
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 removeContentRatingSystems(Context context, Set<String> ids) {
Set<String> contentRatingSystemSet = getContentRatingSystemSet(context);
if (contentRatingSystemSet.removeAll(ids)) {
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();
}
}