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