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