• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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.settings.accessibility;
18 
19 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
20 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_TILE_COMPONENT_NAME;
21 import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logAccessibilityServiceEnabled;
22 import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
23 import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
24 
25 import android.app.settings.SettingsEnums;
26 import android.content.ComponentName;
27 import android.content.Context;
28 import android.content.res.Resources;
29 import android.os.Bundle;
30 import android.provider.Settings;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 
35 import androidx.annotation.VisibleForTesting;
36 import androidx.preference.Preference;
37 
38 import com.android.settings.R;
39 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
40 import com.android.settings.search.BaseSearchIndexProvider;
41 import com.android.settings.widget.SettingsMainSwitchPreference;
42 import com.android.settingslib.core.AbstractPreferenceController;
43 import com.android.settingslib.core.lifecycle.Lifecycle;
44 import com.android.settingslib.search.SearchIndexable;
45 
46 import java.util.ArrayList;
47 import java.util.List;
48 
49 /** Settings for daltonizer. */
50 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
51 public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment
52         implements DaltonizerRadioButtonPreferenceController.OnChangeListener {
53 
54     private static final String TAG = "ToggleDaltonizerPreferenceFragment";
55     private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED;
56     private static final String KEY_PREVIEW = "daltonizer_preview";
57     @VisibleForTesting
58     static final String KEY_DEUTERANOMALY = "daltonizer_mode_deuteranomaly";
59     @VisibleForTesting
60     static final String KEY_PROTANOMALY = "daltonizer_mode_protanomaly";
61     @VisibleForTesting
62     static final String KEY_TRITANOMEALY = "daltonizer_mode_tritanomaly";
63     @VisibleForTesting
64     static final String KEY_GRAYSCALE = "daltonizer_mode_grayscale";
65     private static final List<AbstractPreferenceController> sControllers = new ArrayList<>();
66 
buildPreferenceControllers(Context context, Lifecycle lifecycle)67     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
68             Lifecycle lifecycle) {
69         if (sControllers.size() == 0) {
70             final Resources resources = context.getResources();
71             final String[] daltonizerKeys = resources.getStringArray(
72                     R.array.daltonizer_mode_keys);
73 
74             for (String daltonizerKey : daltonizerKeys) {
75                 sControllers.add(new DaltonizerRadioButtonPreferenceController(
76                         context, lifecycle, daltonizerKey));
77             }
78         }
79         return sControllers;
80     }
81 
82 
83     @Override
registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver)84     protected void registerKeysToObserverCallback(
85             AccessibilitySettingsContentObserver contentObserver) {
86         super.registerKeysToObserverCallback(contentObserver);
87 
88         final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
89         enableServiceFeatureKeys.add(ENABLED);
90         contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
91                 key -> updateSwitchBarToggleSwitch());
92     }
93 
94     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)95     public View onCreateView(LayoutInflater inflater, ViewGroup container,
96             Bundle savedInstanceState) {
97         mComponentName = DALTONIZER_COMPONENT_NAME;
98         mPackageName = getText(R.string.accessibility_display_daltonizer_preference_title);
99         mHtmlDescription = getText(R.string.accessibility_display_daltonizer_preference_subtitle);
100         mTopIntroTitle = getText(R.string.accessibility_daltonizer_about_intro_text);
101         final View view = super.onCreateView(inflater, container, savedInstanceState);
102         updateFooterPreference();
103         return view;
104     }
105 
106     @Override
onViewCreated(View view, Bundle savedInstanceState)107     public void onViewCreated(View view, Bundle savedInstanceState) {
108         super.onViewCreated(view, savedInstanceState);
109         final View rootView = getActivity().getWindow().peekDecorView();
110         if (rootView != null) {
111             rootView.setAccessibilityPaneTitle(getString(
112                     R.string.accessibility_display_daltonizer_preference_title));
113         }
114     }
115 
116     @Override
onCheckedChanged(Preference preference)117     public void onCheckedChanged(Preference preference) {
118         for (AbstractPreferenceController controller : sControllers) {
119             controller.updateState(preference);
120         }
121     }
122 
updateFooterPreference()123     private void updateFooterPreference() {
124         final String title = getPrefContext()
125                 .getString(R.string.accessibility_daltonizer_about_title);
126         final String learnMoreText = getPrefContext()
127                 .getString(R.string.accessibility_daltonizer_footer_learn_more_content_description);
128         mFooterPreferenceController.setIntroductionTitle(title);
129         mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreText);
130         mFooterPreferenceController.displayPreference(getPreferenceScreen());
131     }
132 
133     /** Customizes the order by preference key. */
getPreferenceOrderList()134     protected List<String> getPreferenceOrderList() {
135         final List<String> lists = new ArrayList<>();
136         lists.add(KEY_TOP_INTRO_PREFERENCE);
137         lists.add(KEY_PREVIEW);
138         lists.add(KEY_USE_SERVICE_PREFERENCE);
139         lists.add(KEY_DEUTERANOMALY);
140         lists.add(KEY_PROTANOMALY);
141         lists.add(KEY_TRITANOMEALY);
142         lists.add(KEY_GRAYSCALE);
143         lists.add(KEY_GENERAL_CATEGORY);
144         lists.add(KEY_HTML_DESCRIPTION_PREFERENCE);
145         return lists;
146     }
147 
148     @Override
onResume()149     public void onResume() {
150         super.onResume();
151         updateSwitchBarToggleSwitch();
152         for (AbstractPreferenceController controller :
153                 buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
154             ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(this);
155             ((DaltonizerRadioButtonPreferenceController) controller).displayPreference(
156                     getPreferenceScreen());
157         }
158     }
159 
160     @Override
onPause()161     public void onPause() {
162         for (AbstractPreferenceController controller :
163                 buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
164             ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(null);
165         }
166         super.onPause();
167     }
168 
169     @Override
getMetricsCategory()170     public int getMetricsCategory() {
171         return SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER;
172     }
173 
174     @Override
getHelpResource()175     public int getHelpResource() {
176         return R.string.help_url_color_correction;
177     }
178 
179     @Override
getPreferenceScreenResId()180     protected int getPreferenceScreenResId() {
181         return R.xml.accessibility_daltonizer_settings;
182     }
183 
184     @Override
getLogTag()185     protected String getLogTag() {
186         return TAG;
187     }
188 
189     @Override
onPreferenceToggled(String preferenceKey, boolean enabled)190     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
191         final boolean isEnabled = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON;
192         if (enabled == isEnabled) {
193             return;
194         }
195 
196         if (enabled) {
197             showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE);
198         }
199         logAccessibilityServiceEnabled(mComponentName, enabled);
200         Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? ON : OFF);
201     }
202 
203     @Override
onRemoveSwitchPreferenceToggleSwitch()204     protected void onRemoveSwitchPreferenceToggleSwitch() {
205         super.onRemoveSwitchPreferenceToggleSwitch();
206         mToggleServiceSwitchPreference.setOnPreferenceClickListener(null);
207     }
208 
209     @Override
updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)210     protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
211         switchPreference.setTitle(R.string.accessibility_daltonizer_primary_switch_title);
212     }
213 
214     @Override
getShortcutTitle()215     protected CharSequence getShortcutTitle() {
216         return getText(R.string.accessibility_daltonizer_shortcut_title);
217     }
218 
219     @Override
getUserShortcutTypes()220     int getUserShortcutTypes() {
221         return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
222                 mComponentName);
223     }
224 
225     @Override
getTileComponentName()226     ComponentName getTileComponentName() {
227         return DALTONIZER_TILE_COMPONENT_NAME;
228     }
229 
230     @Override
getTileTooltipContent(@uickSettingsTooltipType int type)231     CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) {
232         return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT
233                 ? R.string.accessibility_color_correction_qs_tooltip_content
234                 : R.string.accessibility_color_correction_auto_added_qs_tooltip_content);
235     }
236 
237     @Override
updateSwitchBarToggleSwitch()238     protected void updateSwitchBarToggleSwitch() {
239         final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON;
240         if (mToggleServiceSwitchPreference.isChecked() == checked) {
241             return;
242         }
243         mToggleServiceSwitchPreference.setChecked(checked);
244     }
245 
246     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
247             new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings);
248 }
249