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