1f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler/*
2f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * Copyright (C) 2016 The Android Open Source Project
3f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler *
4f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
5f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * you may not use this file except in compliance with the License.
6f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * You may obtain a copy of the License at
7f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler *
8f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
9f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler *
10f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * Unless required by applicable law or agreed to in writing, software
11f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
12f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * See the License for the specific language governing permissions and
14f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler * limitations under the License
15f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler */
16f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
17f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerpackage com.android.tv.settings.system;
18f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
19f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.content.Context;
20f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.media.tv.TvInputInfo;
21f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.os.Bundle;
22f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.os.UserHandle;
23f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.support.annotation.NonNull;
24f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.support.v17.preference.LeanbackPreferenceFragment;
25f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.support.v7.preference.Preference;
26f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.support.v7.preference.PreferenceGroup;
27f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.support.v7.preference.TwoStatePreference;
28f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport android.text.TextUtils;
29f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
30f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport com.android.tv.settings.R;
31f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport com.android.tv.settings.RadioPreference;
32f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
33f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport java.util.Map;
34f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerimport java.util.Set;
35f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
36f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantlerpublic class InputOptionsFragment extends LeanbackPreferenceFragment implements
37f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        InputCustomNameFragment.Callback {
38f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
39f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private static final String KEY_SHOW_INPUT = "show_input";
40f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private static final String KEY_NAMES = "names";
41f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private static final String KEY_NAME_DEFAULT = "name_default";
42f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private static final String KEY_NAME_CUSTOM = "name_custom";
43f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
44f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private static final String ARG_INPUT = "input";
45f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
46f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private TwoStatePreference mShowPref;
47f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private PreferenceGroup mNamesGroup;
48f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private TwoStatePreference mNameDefaultPref;
49f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private TwoStatePreference mNameCustomPref;
50f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
51f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private Map<String, String> mCustomLabels;
52f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private Set<String> mHiddenIds;
53f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
54f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private TvInputInfo mInputInfo;
55f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
56f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public static void prepareArgs(@NonNull Bundle args, TvInputInfo inputInfo) {
57f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        args.putParcelable(ARG_INPUT, inputInfo);
58f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
59f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
60f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    @Override
61f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public void onCreate(Bundle savedInstanceState) {
62f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mInputInfo = getArguments().getParcelable(ARG_INPUT);
63f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
64f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        super.onCreate(savedInstanceState);
65f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
66f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final Context context = getContext();
67f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mCustomLabels =
68f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                TvInputInfo.TvInputSettings.getCustomLabels(context, UserHandle.USER_SYSTEM);
69f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mHiddenIds =
70f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                TvInputInfo.TvInputSettings.getHiddenTvInputIds(context, UserHandle.USER_SYSTEM);
71f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
72f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
73f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
74f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    @Override
75f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public void onResume() {
76f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        super.onResume();
77f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        refresh();
78f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
79f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
80f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    @Override
81f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
82f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        setPreferencesFromResource(R.xml.input_options, null);
83f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        getPreferenceScreen().setTitle(mInputInfo.loadLabel(getContext()));
84f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
85f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mShowPref = (TwoStatePreference) findPreference(KEY_SHOW_INPUT);
86f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
87f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mNamesGroup = (PreferenceGroup) findPreference(KEY_NAMES);
88f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
89f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mNameDefaultPref = (TwoStatePreference) findPreference(KEY_NAME_DEFAULT);
90f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mNameCustomPref = (TwoStatePreference) findPreference(KEY_NAME_CUSTOM);
91f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
92f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
93f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
94f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private void refresh() {
95f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
96f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mShowPref.setChecked(!mHiddenIds.contains(mInputInfo.getId()));
97f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
98f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final CharSequence defaultLabel = mInputInfo.loadLabel(getContext());
99f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final CharSequence customLabel = mCustomLabels.get(mInputInfo.getId());
100f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
101f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        boolean nameMatched = false;
102f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        for (int i = 0; i < mNamesGroup.getPreferenceCount(); i++) {
103f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            final TwoStatePreference namePref = (TwoStatePreference) mNamesGroup.getPreference(i);
104f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
105f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            if (TextUtils.equals(namePref.getKey(), KEY_NAME_DEFAULT)
106f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                    || TextUtils.equals(namePref.getKey(), KEY_NAME_CUSTOM)) {
107f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                continue;
108f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            }
109f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            final boolean nameMatch = TextUtils.equals(namePref.getTitle(), customLabel);
110f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            namePref.setChecked(nameMatch);
111f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            nameMatched |= nameMatch;
112f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
113f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
114f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mNameDefaultPref.setTitle(defaultLabel);
115f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
116f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final boolean nameIsDefault = TextUtils.isEmpty(customLabel);
117f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        mNameDefaultPref.setChecked(nameIsDefault);
118f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
119f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        InputCustomNameFragment.prepareArgs(mNameCustomPref.getExtras(), defaultLabel,
120f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                nameIsDefault ? defaultLabel : customLabel);
121f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
122f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (!nameIsDefault && !nameMatched) {
123f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mNameCustomPref.setChecked(true);
124f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mNameCustomPref.setSummary(customLabel);
125f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        } else {
126f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mNameCustomPref.setChecked(false);
127f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mNameCustomPref.setSummary(null);
128f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
129f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
130f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
131f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    @Override
132f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public boolean onPreferenceTreeClick(Preference preference) {
133f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final String key = preference.getKey();
134f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (key == null) {
135f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            return super.onPreferenceTreeClick(preference);
136f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
137f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (preference instanceof RadioPreference) {
138f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            final RadioPreference radioPreference = (RadioPreference) preference;
139f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            radioPreference.setChecked(true);
140f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            radioPreference.clearOtherRadioPreferences(mNamesGroup);
141f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
142f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            if (TextUtils.equals(key, KEY_NAME_CUSTOM)) {
143f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                return super.onPreferenceTreeClick(preference);
144f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            } else if (TextUtils.equals(key, KEY_NAME_DEFAULT)) {
145f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                setInputName(null);
146f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                return true;
147f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            } else {
148f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                setInputName(preference.getTitle());
149f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            }
150f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
151f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        switch (key) {
152f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            case KEY_SHOW_INPUT:
153f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                setInputVisible(((TwoStatePreference) preference).isChecked());
154f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                return true;
155f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
156f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        return super.onPreferenceTreeClick(preference);
157f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
158f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
159f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private void setInputName(CharSequence name) {
160f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (TextUtils.isEmpty(name)) {
161f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mCustomLabels.remove(mInputInfo.getId());
162f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        } else {
163f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mCustomLabels.put(mInputInfo.getId(), name.toString());
164f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
165f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
166f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        TvInputInfo.TvInputSettings
167f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                .putCustomLabels(getContext(), mCustomLabels, UserHandle.USER_SYSTEM);
168f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
169f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
170f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    private void setInputVisible(boolean visible) {
171f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        final boolean wasVisible = !mHiddenIds.contains(mInputInfo.getId());
172f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
173f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (wasVisible == visible) {
174f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            return;
175f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
176f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
177f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        if (visible) {
178f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mHiddenIds.remove(mInputInfo.getId());
179f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        } else {
180f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler            mHiddenIds.add(mInputInfo.getId());
181f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        }
182f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
183f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        TvInputInfo.TvInputSettings
184f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler                .putHiddenTvInputs(getContext(), mHiddenIds, UserHandle.USER_SYSTEM);
185f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
186f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler
187f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    @Override
188f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    public void onSetCustomName(CharSequence name) {
189f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler        setInputName(name);
190f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler    }
191f66f830fbfbc92d355214247c84d70cddf4bfd41Tony Mantler}
192