/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.accessibility; import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_TILE_COMPONENT_NAME; import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logAccessibilityServiceEnabled; import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; import static com.android.settings.accessibility.AccessibilityUtil.State.ON; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; /** Settings for daltonizer. */ @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment implements DaltonizerRadioButtonPreferenceController.OnChangeListener { private static final String TAG = "ToggleDaltonizerPreferenceFragment"; private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED; private static final String KEY_PREVIEW = "daltonizer_preview"; @VisibleForTesting static final String KEY_DEUTERANOMALY = "daltonizer_mode_deuteranomaly"; @VisibleForTesting static final String KEY_PROTANOMALY = "daltonizer_mode_protanomaly"; @VisibleForTesting static final String KEY_TRITANOMEALY = "daltonizer_mode_tritanomaly"; @VisibleForTesting static final String KEY_GRAYSCALE = "daltonizer_mode_grayscale"; @VisibleForTesting static final String KEY_SATURATION = "daltonizer_saturation"; private static final List sControllers = new ArrayList<>(); private static List buildPreferenceControllers(Context context, Lifecycle lifecycle) { if (sControllers.size() == 0) { final Resources resources = context.getResources(); final String[] daltonizerKeys = resources.getStringArray( R.array.daltonizer_mode_keys); for (String daltonizerKey : daltonizerKeys) { sControllers.add(new DaltonizerRadioButtonPreferenceController( context, lifecycle, daltonizerKey)); } } return sControllers; } @Override protected void registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver) { super.registerKeysToObserverCallback(contentObserver); final List enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1); enableServiceFeatureKeys.add(ENABLED); contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys, key -> updateSwitchBarToggleSwitch()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mComponentName = DALTONIZER_COMPONENT_NAME; mPackageName = getText(com.android.settingslib.R .string.accessibility_display_daltonizer_preference_title); mHtmlDescription = getText(com.android.settingslib.R .string.accessibility_display_daltonizer_preference_subtitle); mTopIntroTitle = getText(R.string.accessibility_daltonizer_about_intro_text); final View view = super.onCreateView(inflater, container, savedInstanceState); updateFooterPreference(); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); final View rootView = getActivity().getWindow().peekDecorView(); if (rootView != null) { rootView.setAccessibilityPaneTitle(getString(com.android.settingslib.R .string.accessibility_display_daltonizer_preference_title)); } } @Override public void onCheckedChanged(Preference preference) { for (AbstractPreferenceController controller : sControllers) { controller.updateState(preference); } } private void updateFooterPreference() { final String title = getPrefContext() .getString(R.string.accessibility_daltonizer_about_title); final String learnMoreText = getPrefContext() .getString(R.string.accessibility_daltonizer_footer_learn_more_content_description); mFooterPreferenceController.setIntroductionTitle(title); mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreText); mFooterPreferenceController.displayPreference(getPreferenceScreen()); } /** Customizes the order by preference key. */ protected List getPreferenceOrderList() { final List lists = new ArrayList<>(); lists.add(KEY_TOP_INTRO_PREFERENCE); lists.add(KEY_PREVIEW); lists.add(KEY_USE_SERVICE_PREFERENCE); // Putting saturation level close to the preview so users can see what is changing. lists.add(KEY_SATURATION); lists.add(KEY_DEUTERANOMALY); lists.add(KEY_PROTANOMALY); lists.add(KEY_TRITANOMEALY); lists.add(KEY_GRAYSCALE); lists.add(KEY_GENERAL_CATEGORY); lists.add(KEY_HTML_DESCRIPTION_PREFERENCE); return lists; } @Override public void onResume() { super.onResume(); updateSwitchBarToggleSwitch(); for (AbstractPreferenceController controller : buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(this); ((DaltonizerRadioButtonPreferenceController) controller).displayPreference( getPreferenceScreen()); } } @Override public void onPause() { for (AbstractPreferenceController controller : buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { ((DaltonizerRadioButtonPreferenceController) controller).setOnChangeListener(null); } super.onPause(); } @Override public int getMetricsCategory() { return SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER; } @Override public int getHelpResource() { return R.string.help_url_color_correction; } @Override protected int getPreferenceScreenResId() { return R.xml.accessibility_daltonizer_settings; } @Override protected String getLogTag() { return TAG; } @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { final boolean isEnabled = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; if (enabled == isEnabled) { return; } if (enabled) { showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); } logAccessibilityServiceEnabled(mComponentName, enabled); Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? ON : OFF); } @Override protected void onRemoveSwitchPreferenceToggleSwitch() { super.onRemoveSwitchPreferenceToggleSwitch(); mToggleServiceSwitchPreference.setOnPreferenceClickListener(null); } @Override protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { switchPreference.setTitle(R.string.accessibility_daltonizer_primary_switch_title); } @Override protected CharSequence getShortcutTitle() { return getText(R.string.accessibility_daltonizer_shortcut_title); } @Override int getUserShortcutTypes() { return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(), mComponentName); } @Override ComponentName getTileComponentName() { return DALTONIZER_TILE_COMPONENT_NAME; } @Override CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT ? R.string.accessibility_color_correction_qs_tooltip_content : R.string.accessibility_color_correction_auto_added_qs_tooltip_content); } @Override protected void updateSwitchBarToggleSwitch() { final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; if (mToggleServiceSwitchPreference.isChecked() == checked) { return; } mToggleServiceSwitchPreference.setChecked(checked); } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings); }