Home | History | Annotate | Download | only in system
      1 /*
      2  * Copyright (C) 2016 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.settings.system;
     18 
     19 import android.content.Context;
     20 import android.media.tv.TvInputInfo;
     21 import android.os.Bundle;
     22 import android.os.UserHandle;
     23 import android.support.annotation.NonNull;
     24 import android.support.v7.preference.Preference;
     25 import android.support.v7.preference.PreferenceGroup;
     26 import android.support.v7.preference.TwoStatePreference;
     27 import android.text.TextUtils;
     28 
     29 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
     30 import com.android.tv.settings.R;
     31 import com.android.tv.settings.RadioPreference;
     32 import com.android.tv.settings.SettingsPreferenceFragment;
     33 
     34 import java.util.Map;
     35 import java.util.Set;
     36 
     37 /**
     38  * The screen in TV Settings that shows the options for an input.
     39  */
     40 public class InputOptionsFragment extends SettingsPreferenceFragment implements
     41         InputCustomNameFragment.Callback {
     42 
     43     private static final String KEY_SHOW_INPUT = "show_input";
     44     private static final String KEY_NAMES = "names";
     45     private static final String KEY_NAME_DEFAULT = "name_default";
     46     private static final String KEY_NAME_CUSTOM = "name_custom";
     47 
     48     private static final String ARG_INPUT = "input";
     49 
     50     private TwoStatePreference mShowPref;
     51     private PreferenceGroup mNamesGroup;
     52     private TwoStatePreference mNameDefaultPref;
     53     private TwoStatePreference mNameCustomPref;
     54 
     55     private Map<String, String> mCustomLabels;
     56     private Set<String> mHiddenIds;
     57 
     58     private TvInputInfo mInputInfo;
     59 
     60     public static void prepareArgs(@NonNull Bundle args, TvInputInfo inputInfo) {
     61         args.putParcelable(ARG_INPUT, inputInfo);
     62     }
     63 
     64     @Override
     65     public void onCreate(Bundle savedInstanceState) {
     66         mInputInfo = getArguments().getParcelable(ARG_INPUT);
     67 
     68         super.onCreate(savedInstanceState);
     69 
     70         final Context context = getContext();
     71         mCustomLabels =
     72                 TvInputInfo.TvInputSettings.getCustomLabels(context, UserHandle.USER_SYSTEM);
     73         mHiddenIds =
     74                 TvInputInfo.TvInputSettings.getHiddenTvInputIds(context, UserHandle.USER_SYSTEM);
     75 
     76     }
     77 
     78     @Override
     79     public void onResume() {
     80         super.onResume();
     81         refresh();
     82     }
     83 
     84     @Override
     85     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
     86         setPreferencesFromResource(R.xml.input_options, null);
     87         getPreferenceScreen().setTitle(mInputInfo.loadLabel(getContext()));
     88 
     89         mShowPref = (TwoStatePreference) findPreference(KEY_SHOW_INPUT);
     90 
     91         mNamesGroup = (PreferenceGroup) findPreference(KEY_NAMES);
     92 
     93         mNameDefaultPref = (TwoStatePreference) findPreference(KEY_NAME_DEFAULT);
     94         mNameCustomPref = (TwoStatePreference) findPreference(KEY_NAME_CUSTOM);
     95 
     96     }
     97 
     98     private void refresh() {
     99 
    100         mShowPref.setChecked(!mHiddenIds.contains(mInputInfo.getId()));
    101 
    102         final CharSequence defaultLabel = mInputInfo.loadLabel(getContext());
    103         final CharSequence customLabel = mCustomLabels.get(mInputInfo.getId());
    104 
    105         boolean nameMatched = false;
    106         for (int i = 0; i < mNamesGroup.getPreferenceCount(); i++) {
    107             final TwoStatePreference namePref = (TwoStatePreference) mNamesGroup.getPreference(i);
    108 
    109             if (TextUtils.equals(namePref.getKey(), KEY_NAME_DEFAULT)
    110                     || TextUtils.equals(namePref.getKey(), KEY_NAME_CUSTOM)) {
    111                 continue;
    112             }
    113             final boolean nameMatch = TextUtils.equals(namePref.getTitle(), customLabel);
    114             namePref.setChecked(nameMatch);
    115             nameMatched |= nameMatch;
    116         }
    117 
    118         mNameDefaultPref.setTitle(defaultLabel);
    119 
    120         final boolean nameIsDefault = TextUtils.isEmpty(customLabel);
    121         mNameDefaultPref.setChecked(nameIsDefault);
    122 
    123         InputCustomNameFragment.prepareArgs(mNameCustomPref.getExtras(), defaultLabel,
    124                 nameIsDefault ? defaultLabel : customLabel);
    125 
    126         if (!nameIsDefault && !nameMatched) {
    127             mNameCustomPref.setChecked(true);
    128             mNameCustomPref.setSummary(customLabel);
    129         } else {
    130             mNameCustomPref.setChecked(false);
    131             mNameCustomPref.setSummary(null);
    132         }
    133     }
    134 
    135     @Override
    136     public boolean onPreferenceTreeClick(Preference preference) {
    137         final String key = preference.getKey();
    138         if (key == null) {
    139             return super.onPreferenceTreeClick(preference);
    140         }
    141         if (preference instanceof RadioPreference) {
    142             final RadioPreference radioPreference = (RadioPreference) preference;
    143             radioPreference.setChecked(true);
    144             radioPreference.clearOtherRadioPreferences(mNamesGroup);
    145 
    146             if (TextUtils.equals(key, KEY_NAME_CUSTOM)) {
    147                 return super.onPreferenceTreeClick(preference);
    148             } else if (TextUtils.equals(key, KEY_NAME_DEFAULT)) {
    149                 setInputName(null);
    150                 return true;
    151             } else {
    152                 setInputName(preference.getTitle());
    153             }
    154         }
    155         switch (key) {
    156             case KEY_SHOW_INPUT:
    157                 setInputVisible(((TwoStatePreference) preference).isChecked());
    158                 return true;
    159         }
    160         return super.onPreferenceTreeClick(preference);
    161     }
    162 
    163     private void setInputName(CharSequence name) {
    164         if (TextUtils.isEmpty(name)) {
    165             mCustomLabels.remove(mInputInfo.getId());
    166         } else {
    167             mCustomLabels.put(mInputInfo.getId(), name.toString());
    168         }
    169 
    170         TvInputInfo.TvInputSettings
    171                 .putCustomLabels(getContext(), mCustomLabels, UserHandle.USER_SYSTEM);
    172     }
    173 
    174     private void setInputVisible(boolean visible) {
    175         final boolean wasVisible = !mHiddenIds.contains(mInputInfo.getId());
    176 
    177         if (wasVisible == visible) {
    178             return;
    179         }
    180 
    181         if (visible) {
    182             mHiddenIds.remove(mInputInfo.getId());
    183         } else {
    184             mHiddenIds.add(mInputInfo.getId());
    185         }
    186 
    187         TvInputInfo.TvInputSettings
    188                 .putHiddenTvInputs(getContext(), mHiddenIds, UserHandle.USER_SYSTEM);
    189     }
    190 
    191     @Override
    192     public void onSetCustomName(CharSequence name) {
    193         setInputName(name);
    194     }
    195 
    196     @Override
    197     public int getMetricsCategory() {
    198         return MetricsEvent.SETTINGS_TV_INPUT_OPTIONS_CATEGORY;
    199     }
    200 }
    201