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.settings.accessibility.AccessibilityStatsLogUtils.logAccessibilityServiceEnabled; 21 import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; 22 import static com.android.settings.accessibility.AccessibilityUtil.State.ON; 23 24 import android.app.settings.SettingsEnums; 25 import android.content.Context; 26 import android.content.res.Resources; 27 import android.net.Uri; 28 import android.os.Bundle; 29 import android.os.Handler; 30 import android.provider.Settings; 31 import android.view.LayoutInflater; 32 import android.view.View; 33 import android.view.ViewGroup; 34 35 import androidx.preference.Preference; 36 37 import com.android.settings.R; 38 import com.android.settings.search.BaseSearchIndexProvider; 39 import com.android.settings.widget.SettingsMainSwitchPreference; 40 import com.android.settingslib.core.AbstractPreferenceController; 41 import com.android.settingslib.core.lifecycle.Lifecycle; 42 import com.android.settingslib.search.SearchIndexable; 43 44 import java.util.ArrayList; 45 import java.util.List; 46 47 /** Settings for daltonizer. */ 48 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) 49 public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment 50 implements DaltonizerRadioButtonPreferenceController.OnChangeListener { 51 52 private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED; 53 private static final String KEY_PREVIEW = "daltonizer_preview"; 54 private static final String KEY_CATEGORY_MODE = "daltonizer_mode_category"; 55 private static final List<AbstractPreferenceController> sControllers = new ArrayList<>(); 56 private final Handler mHandler = new Handler(); 57 private SettingsContentObserver mSettingsContentObserver; 58 buildPreferenceControllers(Context context, Lifecycle lifecycle)59 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 60 Lifecycle lifecycle) { 61 if (sControllers.size() == 0) { 62 final Resources resources = context.getResources(); 63 final String[] daltonizerKeys = resources.getStringArray( 64 R.array.daltonizer_mode_keys); 65 66 for (int i = 0; i < daltonizerKeys.length; i++) { 67 sControllers.add(new DaltonizerRadioButtonPreferenceController( 68 context, lifecycle, daltonizerKeys[i])); 69 } 70 } 71 return sControllers; 72 } 73 74 @Override onCheckedChanged(Preference preference)75 public void onCheckedChanged(Preference preference) { 76 for (AbstractPreferenceController controller : sControllers) { 77 controller.updateState(preference); 78 } 79 } 80 81 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)82 public View onCreateView(LayoutInflater inflater, ViewGroup container, 83 Bundle savedInstanceState) { 84 mComponentName = DALTONIZER_COMPONENT_NAME; 85 mPackageName = getText(R.string.accessibility_display_daltonizer_preference_title); 86 mHtmlDescription = getText(R.string.accessibility_display_daltonizer_preference_subtitle); 87 final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1); 88 enableServiceFeatureKeys.add(ENABLED); 89 mSettingsContentObserver = new SettingsContentObserver(mHandler, enableServiceFeatureKeys) { 90 @Override 91 public void onChange(boolean selfChange, Uri uri) { 92 updateSwitchBarToggleSwitch(); 93 } 94 }; 95 96 final View view = super.onCreateView(inflater, container, savedInstanceState); 97 updateFooterPreference(); 98 return view; 99 } 100 updateFooterPreference()101 private void updateFooterPreference() { 102 final String title = getPrefContext() 103 .getString(R.string.accessibility_daltonizer_about_title); 104 final String learnMoreContentDescription = getPrefContext() 105 .getString(R.string.accessibility_daltonizer_footer_learn_more_content_description); 106 mFooterPreferenceController.setIntroductionTitle(title); 107 mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreContentDescription); 108 mFooterPreferenceController.displayPreference(getPreferenceScreen()); 109 } 110 111 /** Customizes the order by preference key. */ getPreferenceOrderList()112 protected List<String> getPreferenceOrderList() { 113 final List<String> lists = new ArrayList<>(); 114 lists.add(KEY_PREVIEW); 115 lists.add(KEY_USE_SERVICE_PREFERENCE); 116 lists.add(KEY_CATEGORY_MODE); 117 lists.add(KEY_GENERAL_CATEGORY); 118 lists.add(KEY_HTML_DESCRIPTION_PREFERENCE); 119 return lists; 120 } 121 122 @Override onResume()123 public void onResume() { 124 super.onResume(); 125 updateSwitchBarToggleSwitch(); 126 mSettingsContentObserver.register(getContentResolver()); 127 128 for (AbstractPreferenceController controller : 129 buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { 130 ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(this); 131 ((DaltonizerRadioButtonPreferenceController) controller).displayPreference( 132 getPreferenceScreen()); 133 } 134 } 135 136 @Override onPause()137 public void onPause() { 138 mSettingsContentObserver.unregister(getContentResolver()); 139 for (AbstractPreferenceController controller : 140 buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { 141 ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(null); 142 } 143 super.onPause(); 144 } 145 146 @Override getMetricsCategory()147 public int getMetricsCategory() { 148 return SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER; 149 } 150 151 @Override getHelpResource()152 public int getHelpResource() { 153 return R.string.help_url_color_correction; 154 } 155 156 @Override getPreferenceScreenResId()157 protected int getPreferenceScreenResId() { 158 return R.xml.accessibility_daltonizer_settings; 159 } 160 161 @Override onPreferenceToggled(String preferenceKey, boolean enabled)162 protected void onPreferenceToggled(String preferenceKey, boolean enabled) { 163 logAccessibilityServiceEnabled(mComponentName, enabled); 164 Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? ON : OFF); 165 } 166 167 @Override onRemoveSwitchPreferenceToggleSwitch()168 protected void onRemoveSwitchPreferenceToggleSwitch() { 169 super.onRemoveSwitchPreferenceToggleSwitch(); 170 mToggleServiceSwitchPreference.setOnPreferenceClickListener(null); 171 } 172 173 @Override updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)174 protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { 175 switchPreference.setTitle(R.string.accessibility_daltonizer_primary_switch_title); 176 } 177 178 @Override updateShortcutTitle(ShortcutPreference shortcutPreference)179 protected void updateShortcutTitle(ShortcutPreference shortcutPreference) { 180 shortcutPreference.setTitle(R.string.accessibility_daltonizer_shortcut_title); 181 } 182 183 @Override getUserShortcutTypes()184 int getUserShortcutTypes() { 185 return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(), 186 mComponentName); 187 } 188 189 @Override updateSwitchBarToggleSwitch()190 protected void updateSwitchBarToggleSwitch() { 191 final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; 192 if (mToggleServiceSwitchPreference.isChecked() == checked) { 193 return; 194 } 195 mToggleServiceSwitchPreference.setChecked(checked); 196 } 197 198 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 199 new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings); 200 } 201