diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 733ab32d75e33..23b23af3a2c4b 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4738,6 +4738,23 @@ public final class Settings { public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; + /** + * List of TV inputs that are currently hidden. This is a string + * containing the IDs of all hidden TV inputs. Each ID is separated by ':'. + * + * @hide + */ + public static final String TV_INPUT_HIDDEN_INPUTS = "tv_input_hidden_inputs"; + + /** + * List of custom TV input labels. This is a string containing + * pairs. Each pair is separated by ':' and TV input id and custom name are separated by + * ','. + * + * @hide + */ + public static final String TV_INPUT_CUSTOM_LABELS = "tv_input_custom_labels"; + /** * This are the settings to be backed up. * diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index 8d0e986a5b98a..94e9b41ecfc85 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -33,9 +33,12 @@ import android.hardware.hdmi.HdmiDeviceInfo; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import android.os.UserHandle; +import android.provider.Settings; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.util.SparseIntArray; import android.util.Xml; @@ -44,6 +47,9 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * This class is used to specify meta information of a TV input. @@ -390,7 +396,20 @@ public final class TvInputInfo implements Parcelable { } /** - * Loads the user-displayed label for this TV input service. + * Checks if this TV input is marked hidden by the user in the settings. + * + * @param context Supplies a {@link Context} used to check if this TV input is hidden. + * @return {@code true} if the user marked this TV input hidden in settings. {@code false} + * otherwise. + * @hide + */ + @SystemApi + public boolean isHidden(Context context) { + return TvInputSettings.isHidden(context, mId, UserHandle.USER_CURRENT); + } + + /** + * Loads the user-displayed label for this TV input. * * @param context Supplies a {@link Context} used to load the label. * @return a CharSequence containing the TV input's label. If the TV input does not have @@ -405,7 +424,20 @@ public final class TvInputInfo implements Parcelable { } /** - * Loads the user-displayed icon for this TV input service. + * Loads the custom label set by user in settings. + * + * @param context Supplies a {@link Context} used to load the custom label. + * @return a CharSequence containing the TV input's custom label. {@code null} if there is no + * custom label. + * @hide + */ + @SystemApi + public CharSequence loadCustomLabel(Context context) { + return TvInputSettings.getCustomLabel(context, mId, UserHandle.USER_CURRENT); + } + + /** + * Loads the user-displayed icon for this TV input. * * @param context Supplies a {@link Context} used to load the icon. * @return a Drawable containing the TV input's icon. If the TV input does not have @@ -551,4 +583,139 @@ public final class TvInputInfo implements Parcelable { mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false; mRatingSystemXmlUri = in.readParcelable(null); } + + /** + * Utility class for putting and getting settings for TV input. + * + * @hide + */ + @SystemApi + public static final class TvInputSettings { + private static final String TV_INPUT_SEPARATOR = ":"; + private static final String CUSTOM_NAME_SEPARATOR = ","; + + private TvInputSettings() { } + + private static boolean isHidden(Context context, String inputId, int userId) { + return getHiddenTvInputIds(context, userId).contains(inputId); + } + + private static String getCustomLabel(Context context, String inputId, int userId) { + for (Pair pair : getCustomLabelList(context, userId)) { + if (pair.first.equals(inputId)) { + return pair.second; + } + } + return null; + } + + /** + * Returns a list of TV input IDs which are marked as hidden by user in the settings. + * + * @param context The application context + * @param userId The user ID for the stored hidden input list + * @hide + */ + @SystemApi + public static List getHiddenTvInputIds(Context context, int userId) { + String hiddenIdsString = Settings.Secure.getStringForUser( + context.getContentResolver(), Settings.Secure.TV_INPUT_HIDDEN_INPUTS, userId); + if (TextUtils.isEmpty(hiddenIdsString)) { + return new ArrayList(); + } + String[] ids = hiddenIdsString.split(TV_INPUT_SEPARATOR); + return Arrays.asList(ids); + } + + /** + * Returns a list of TV input ID/custom label pairs set by the user in the settings. + * + * @param context The application context + * @param userId The user ID for the stored hidden input list + * @hide + */ + @SystemApi + public static List> getCustomLabelList(Context context, int userId) { + String labelsString = Settings.Secure.getStringForUser( + context.getContentResolver(), Settings.Secure.TV_INPUT_CUSTOM_LABELS, userId); + List> list = new ArrayList>(); + if (TextUtils.isEmpty(labelsString)) { + return list; + } + String[] pairs = labelsString.split(TV_INPUT_SEPARATOR); + for (String pairString : pairs) { + String[] pair = pairString.split(CUSTOM_NAME_SEPARATOR); + list.add(new Pair(pair[0], pair[1])); + } + return list; + } + + /** + * Stores a list of TV input IDs which are marked as hidden by user. This is expected to + * be called from the settings app. + * + * @param context The application context + * @param hiddenInputIds A list including all the hidden TV input IDs + * @param userId The user ID for the stored hidden input list + * @hide + */ + @SystemApi + public static void putHiddenTvInputList(Context context, List hiddenInputIds, + int userId) { + StringBuilder builder = new StringBuilder(); + boolean firstItem = true; + for (String inputId : hiddenInputIds) { + ensureSeparatorIsNotIncluded(inputId); + if (firstItem) { + firstItem = false; + } else { + builder.append(TV_INPUT_SEPARATOR); + } + builder.append(inputId); + } + Settings.Secure.putStringForUser(context.getContentResolver(), + Settings.Secure.TV_INPUT_HIDDEN_INPUTS, builder.toString(), userId); + } + + /** + * Stores a list of TV input ID/custom label pairs set by user. This is expected to be + * called from the settings app. + * + * @param context The application context. + * @param customLabels A list of TV input ID/custom label pairs + * @param userId The user ID for the stored hidden input list + * @hide + */ + @SystemApi + public static void putCustomLabelList(Context context, + List> customLabels, int userId) { + StringBuilder builder = new StringBuilder(); + boolean firstItem = true; + for (Pair pair : customLabels) { + ensureSeparatorIsNotIncluded(pair.first); + ensureSeparatorIsNotIncluded(pair.second); + if (firstItem) { + firstItem = false; + } else { + builder.append(TV_INPUT_SEPARATOR); + } + builder.append(pair.first); + builder.append(CUSTOM_NAME_SEPARATOR); + builder.append(pair.second); + } + Settings.Secure.putStringForUser(context.getContentResolver(), + Settings.Secure.TV_INPUT_CUSTOM_LABELS, builder.toString(), userId); + } + + private static void ensureSeparatorIsNotIncluded(String value) { + if (value.contains(TV_INPUT_SEPARATOR)) { + throw new IllegalArgumentException( value + " should not include " + + TV_INPUT_SEPARATOR); + } + if (value.contains(CUSTOM_NAME_SEPARATOR)) { + throw new IllegalArgumentException( value + " should not include " + + CUSTOM_NAME_SEPARATOR); + } + } + } }