• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
20 import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME;
21 import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logAccessibilityServiceEnabled;
22 
23 import android.app.settings.SettingsEnums;
24 import android.content.ComponentName;
25 import android.content.ContentResolver;
26 import android.content.Context;
27 import android.hardware.display.ColorDisplayManager;
28 import android.net.Uri;
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.PreferenceCategory;
37 import androidx.preference.TwoStatePreference;
38 
39 import com.android.settings.R;
40 import com.android.settings.search.BaseSearchIndexProvider;
41 import com.android.settings.widget.SeekBarPreference;
42 import com.android.settings.widget.SettingsMainSwitchPreference;
43 import com.android.settingslib.search.SearchIndexable;
44 import com.android.settingslib.search.SearchIndexableRaw;
45 
46 import java.util.ArrayList;
47 import java.util.List;
48 
49 /** Settings for reducing brightness. */
50 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
51 public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePreferenceFragment {
52 
53     private static final String TAG = "ToggleReduceBrightColorsPreferenceFragment";
54     private static final String KEY_INTENSITY = "rbc_intensity";
55     private static final String KEY_PERSIST = "rbc_persist";
56     @VisibleForTesting
57     static final String KEY_SHORTCUT = "rbc_shortcut";
58     @VisibleForTesting
59     static final String KEY_SWITCH = "rbc_switch";
60     private static final String REDUCE_BRIGHT_COLORS_ACTIVATED_KEY =
61             Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED;
62 
63     private ReduceBrightColorsIntensityPreferenceController mRbcIntensityPreferenceController;
64     private ReduceBrightColorsPersistencePreferenceController mRbcPersistencePreferenceController;
65     private ColorDisplayManager mColorDisplayManager;
66 
67     @Override
registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver)68     protected void registerKeysToObserverCallback(
69             AccessibilitySettingsContentObserver contentObserver) {
70         super.registerKeysToObserverCallback(contentObserver);
71 
72         final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
73         enableServiceFeatureKeys.add(REDUCE_BRIGHT_COLORS_ACTIVATED_KEY);
74         contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
75                 key -> updateSwitchBarToggleSwitch());
76     }
77 
78     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)79     public View onCreateView(LayoutInflater inflater, ViewGroup container,
80             Bundle savedInstanceState) {
81         mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
82                 .authority(getPrefContext().getPackageName())
83                 .appendPath(String.valueOf(R.raw.a11y_extra_dim_banner))
84                 .build();
85         mComponentName = REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
86         mFeatureName = getText(R.string.reduce_bright_colors_preference_title);
87         mHtmlDescription = getText(R.string.reduce_bright_colors_preference_subtitle);
88         mTopIntroTitle = getText(R.string.reduce_bright_colors_preference_intro_text);
89         mRbcIntensityPreferenceController =
90                 new ReduceBrightColorsIntensityPreferenceController(getContext(), KEY_INTENSITY);
91         mRbcPersistencePreferenceController =
92                 new ReduceBrightColorsPersistencePreferenceController(getContext(), KEY_PERSIST);
93         mRbcIntensityPreferenceController.displayPreference(getPreferenceScreen());
94         mRbcPersistencePreferenceController.displayPreference(getPreferenceScreen());
95         mColorDisplayManager = getContext().getSystemService(ColorDisplayManager.class);
96         final View view = super.onCreateView(inflater, container, savedInstanceState);
97         // Parent sets the title when creating the view, so set it after calling super
98         mToggleServiceSwitchPreference.setTitle(R.string.reduce_bright_colors_switch_title);
99         updateGeneralCategoryOrder();
100         updateFooterPreference();
101         return view;
102     }
103 
updateGeneralCategoryOrder()104     private void updateGeneralCategoryOrder() {
105         final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
106         final SeekBarPreference intensity = findPreference(KEY_INTENSITY);
107         getPreferenceScreen().removePreference(intensity);
108         intensity.setOrder(mShortcutPreference.getOrder() - 2);
109         generalCategory.addPreference(intensity);
110         final TwoStatePreference persist = findPreference(KEY_PERSIST);
111         getPreferenceScreen().removePreference(persist);
112         persist.setOrder(mShortcutPreference.getOrder() - 1);
113         generalCategory.addPreference(persist);
114     }
115 
updateFooterPreference()116     private void updateFooterPreference() {
117         final String title = getPrefContext().getString(R.string.reduce_bright_colors_about_title);
118         mFooterPreferenceController.setIntroductionTitle(title);
119         mFooterPreferenceController.displayPreference(getPreferenceScreen());
120     }
121 
122     @Override
onResume()123     public void onResume() {
124         super.onResume();
125         updateSwitchBarToggleSwitch();
126     }
127 
128     @Override
getMetricsCategory()129     public int getMetricsCategory() {
130         return SettingsEnums.REDUCE_BRIGHT_COLORS_SETTINGS;
131     }
132 
133     @Override
getHelpResource()134     public int getHelpResource() {
135         // TODO(b/170973645): Link to help support page
136         return 0;
137     }
138 
139     @Override
getPreferenceScreenResId()140     protected int getPreferenceScreenResId() {
141         return R.xml.reduce_bright_colors_settings;
142     }
143 
144     @Override
getLogTag()145     protected String getLogTag() {
146         return TAG;
147     }
148 
149     @Override
onPreferenceToggled(String preferenceKey, boolean enabled)150     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
151         logAccessibilityServiceEnabled(mComponentName, enabled);
152         mColorDisplayManager.setReduceBrightColorsActivated(enabled);
153     }
154 
155     @Override
onRemoveSwitchPreferenceToggleSwitch()156     protected void onRemoveSwitchPreferenceToggleSwitch() {
157         super.onRemoveSwitchPreferenceToggleSwitch();
158         mToggleServiceSwitchPreference.setOnPreferenceClickListener(
159                 /* onPreferenceClickListener= */ null);
160     }
161 
162     @Override
updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)163     protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
164         switchPreference.setTitle(R.string.reduce_bright_colors_preference_title);
165     }
166 
167     @Override
getShortcutTitle()168     protected CharSequence getShortcutTitle() {
169         return getText(R.string.reduce_bright_colors_shortcut_title);
170     }
171 
172     @Override
getUserShortcutTypes()173     int getUserShortcutTypes() {
174         return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
175                 mComponentName);
176     }
177 
178     @Override
getTileComponentName()179     ComponentName getTileComponentName() {
180         return REDUCE_BRIGHT_COLORS_TILE_SERVICE_COMPONENT_NAME;
181     }
182 
183     @Override
updateSwitchBarToggleSwitch()184     protected void updateSwitchBarToggleSwitch() {
185         final boolean checked = mColorDisplayManager.isReduceBrightColorsActivated();
186         mRbcIntensityPreferenceController.updateState(getPreferenceScreen()
187                 .findPreference(KEY_INTENSITY));
188         mRbcPersistencePreferenceController.updateState(getPreferenceScreen()
189                 .findPreference(KEY_PERSIST));
190         if (mToggleServiceSwitchPreference.isChecked() != checked) {
191             mToggleServiceSwitchPreference.setChecked(checked);
192         }
193     }
194 
195     @Override
getUseServicePreferenceKey()196     protected String getUseServicePreferenceKey() {
197         return KEY_SWITCH;
198     }
199 
200     @Override
getShortcutPreferenceKey()201     protected String getShortcutPreferenceKey() {
202         return KEY_SHORTCUT;
203     }
204 
205     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
206             new BaseSearchIndexProvider(R.xml.reduce_bright_colors_settings) {
207                 @Override
208                 protected boolean isPageSearchEnabled(Context context) {
209                     return ColorDisplayManager.isReduceBrightColorsAvailable(context);
210                 }
211 
212                 @Override
213                 public List<SearchIndexableRaw> getRawDataToIndex(Context context,
214                         boolean enabled) {
215                     final List<SearchIndexableRaw> rawData =
216                             super.getRawDataToIndex(context, enabled);
217 
218                     if (Flags.fixA11ySettingsSearch()) {
219                         SearchIndexableRaw shortcutRaw = new SearchIndexableRaw(context);
220                         shortcutRaw.key = KEY_SHORTCUT;
221                         shortcutRaw.title = context.getString(
222                                 R.string.reduce_bright_colors_shortcut_title);
223                         rawData.add(shortcutRaw);
224 
225                         SearchIndexableRaw mainSwitchRaw = new SearchIndexableRaw(context);
226                         mainSwitchRaw.key = KEY_SWITCH;
227                         mainSwitchRaw.title = context.getString(
228                                 R.string.reduce_bright_colors_switch_title);
229                         rawData.add(mainSwitchRaw);
230                     }
231                     return rawData;
232                 }
233             };
234 }
235