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 android.app.settings.SettingsEnums;
20 import android.content.ContentResolver;
21 import android.content.Context;
22 import android.hardware.display.ColorDisplayManager;
23 import android.net.Uri;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.provider.Settings;
27 import android.view.LayoutInflater;
28 import android.view.View;
29 import android.view.ViewGroup;
30 
31 import androidx.preference.PreferenceCategory;
32 import androidx.preference.SwitchPreference;
33 
34 import com.android.internal.accessibility.AccessibilityShortcutController;
35 import com.android.settings.R;
36 import com.android.settings.search.BaseSearchIndexProvider;
37 import com.android.settings.widget.SeekBarPreference;
38 import com.android.settings.widget.SettingsMainSwitchPreference;
39 import com.android.settingslib.search.SearchIndexable;
40 
41 import java.util.ArrayList;
42 import java.util.List;
43 
44 /** Settings for reducing brightness. */
45 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
46 public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePreferenceFragment {
47 
48     private static final String REDUCE_BRIGHT_COLORS_ACTIVATED_KEY =
49             Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED;
50     private static final String KEY_INTENSITY = "rbc_intensity";
51     private static final String KEY_PERSIST = "rbc_persist";
52 
53     private final Handler mHandler = new Handler();
54     private SettingsContentObserver mSettingsContentObserver;
55     private ReduceBrightColorsIntensityPreferenceController mRbcIntensityPreferenceController;
56     private ReduceBrightColorsPersistencePreferenceController mRbcPersistencePreferenceController;
57     private ColorDisplayManager mColorDisplayManager;
58 
59     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)60     public View onCreateView(LayoutInflater inflater, ViewGroup container,
61             Bundle savedInstanceState) {
62 
63         mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
64                 .authority(getPrefContext().getPackageName())
65                 .appendPath(String.valueOf(R.raw.extra_dim_banner))
66                 .build();
67         mComponentName = AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
68         mPackageName = getText(R.string.reduce_bright_colors_preference_title);
69         mHtmlDescription = getText(R.string.reduce_bright_colors_preference_subtitle);
70         final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
71         enableServiceFeatureKeys.add(REDUCE_BRIGHT_COLORS_ACTIVATED_KEY);
72         mRbcIntensityPreferenceController =
73                 new ReduceBrightColorsIntensityPreferenceController(getContext(), KEY_INTENSITY);
74         mRbcPersistencePreferenceController =
75                 new ReduceBrightColorsPersistencePreferenceController(getContext(), KEY_PERSIST);
76         mRbcIntensityPreferenceController.displayPreference(getPreferenceScreen());
77         mRbcPersistencePreferenceController.displayPreference(getPreferenceScreen());
78         mSettingsContentObserver = new SettingsContentObserver(mHandler, enableServiceFeatureKeys) {
79             @Override
80             public void onChange(boolean selfChange, Uri uri) {
81                 updateSwitchBarToggleSwitch();
82             }
83         };
84         mColorDisplayManager = getContext().getSystemService(ColorDisplayManager.class);
85         final View view = super.onCreateView(inflater, container, savedInstanceState);
86         // Parent sets the title when creating the view, so set it after calling super
87         mToggleServiceSwitchPreference.setTitle(R.string.reduce_bright_colors_switch_title);
88         updateGeneralCategoryOrder();
89         updateFooterPreference();
90         return view;
91     }
92 
updateGeneralCategoryOrder()93     private void updateGeneralCategoryOrder() {
94         final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
95         final SeekBarPreference intensity = findPreference(KEY_INTENSITY);
96         getPreferenceScreen().removePreference(intensity);
97         intensity.setOrder(mShortcutPreference.getOrder() - 2);
98         generalCategory.addPreference(intensity);
99         final SwitchPreference persist = findPreference(KEY_PERSIST);
100         getPreferenceScreen().removePreference(persist);
101         persist.setOrder(mShortcutPreference.getOrder() - 1);
102         generalCategory.addPreference(persist);
103     }
104 
updateFooterPreference()105     private void updateFooterPreference() {
106         final String title = getPrefContext().getString(R.string.reduce_bright_colors_about_title);
107         mFooterPreferenceController.setIntroductionTitle(title);
108         mFooterPreferenceController.displayPreference(getPreferenceScreen());
109     }
110 
111     @Override
onViewCreated(View view, Bundle savedInstanceState)112     public void onViewCreated(View view, Bundle savedInstanceState) {
113         super.onViewCreated(view, savedInstanceState);
114     }
115 
116     @Override
onResume()117     public void onResume() {
118         super.onResume();
119         updateSwitchBarToggleSwitch();
120         mSettingsContentObserver.register(getContentResolver());
121     }
122 
123     @Override
onPause()124     public void onPause() {
125         mSettingsContentObserver.unregister(getContentResolver());
126         super.onPause();
127     }
128 
129     @Override
getMetricsCategory()130     public int getMetricsCategory() {
131         return SettingsEnums.REDUCE_BRIGHT_COLORS_SETTINGS;
132     }
133 
134     @Override
getHelpResource()135     public int getHelpResource() {
136         // TODO(170973645): Link to help support page
137         return 0;
138     }
139 
140     @Override
getPreferenceScreenResId()141     protected int getPreferenceScreenResId() {
142         return R.xml.reduce_bright_colors_settings;
143     }
144 
145     @Override
onPreferenceToggled(String preferenceKey, boolean enabled)146     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
147         AccessibilityStatsLogUtils.logAccessibilityServiceEnabled(mComponentName, enabled);
148         mColorDisplayManager.setReduceBrightColorsActivated(enabled);
149     }
150 
151     @Override
onRemoveSwitchPreferenceToggleSwitch()152     protected void onRemoveSwitchPreferenceToggleSwitch() {
153         super.onRemoveSwitchPreferenceToggleSwitch();
154         mToggleServiceSwitchPreference.setOnPreferenceClickListener(
155                 /* onPreferenceClickListener= */ null);
156     }
157 
158     @Override
updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)159     protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
160         switchPreference.setTitle(R.string.reduce_bright_colors_preference_title);
161     }
162 
163     @Override
updateShortcutTitle(ShortcutPreference shortcutPreference)164     protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
165         shortcutPreference.setTitle(R.string.reduce_bright_colors_shortcut_title);
166     }
167 
168     @Override
getUserShortcutTypes()169     int getUserShortcutTypes() {
170         return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
171                 mComponentName);
172     }
173 
174     @Override
updateSwitchBarToggleSwitch()175     protected void updateSwitchBarToggleSwitch() {
176         final boolean checked = mColorDisplayManager.isReduceBrightColorsActivated();
177         mRbcIntensityPreferenceController.updateState(getPreferenceScreen()
178                 .findPreference(KEY_INTENSITY));
179         mRbcPersistencePreferenceController.updateState(getPreferenceScreen()
180                 .findPreference(KEY_PERSIST));
181         if (mToggleServiceSwitchPreference.isChecked() != checked) {
182             mToggleServiceSwitchPreference.setChecked(checked);
183         }
184     }
185 
186     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
187             new BaseSearchIndexProvider(R.xml.reduce_bright_colors_settings) {
188                 @Override
189                 protected boolean isPageSearchEnabled(Context context) {
190                     return ColorDisplayManager.isReduceBrightColorsAvailable(context);
191                 }
192             };
193 }
194