1 /* 2 * Copyright (C) 2019 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.COLOR_INVERSION_COMPONENT_NAME; 20 import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_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.ContentResolver; 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 com.android.settings.R; 36 import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; 37 import com.android.settings.search.BaseSearchIndexProvider; 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 page for color inversion. */ 45 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) 46 public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePreferenceFragment { 47 48 private static final String TAG = "ToggleColorInversionPreferenceFragment"; 49 private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED; 50 51 @Override registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver)52 protected void registerKeysToObserverCallback( 53 AccessibilitySettingsContentObserver contentObserver) { 54 super.registerKeysToObserverCallback(contentObserver); 55 56 final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1); 57 enableServiceFeatureKeys.add(ENABLED); 58 contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys, 59 key -> updateSwitchBarToggleSwitch()); 60 } 61 62 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)63 public View onCreateView(LayoutInflater inflater, ViewGroup container, 64 Bundle savedInstanceState) { 65 mComponentName = COLOR_INVERSION_COMPONENT_NAME; 66 mPackageName = getText(R.string.accessibility_display_inversion_preference_title); 67 mHtmlDescription = getText(R.string.accessibility_display_inversion_preference_subtitle); 68 mTopIntroTitle = getText(R.string.accessibility_display_inversion_preference_intro_text); 69 mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) 70 .authority(getPrefContext().getPackageName()) 71 .appendPath(String.valueOf(R.raw.a11y_color_inversion_banner)) 72 .build(); 73 final View view = super.onCreateView(inflater, container, savedInstanceState); 74 updateFooterPreference(); 75 return view; 76 } 77 78 @Override onViewCreated(View view, Bundle savedInstanceState)79 public void onViewCreated(View view, Bundle savedInstanceState) { 80 super.onViewCreated(view, savedInstanceState); 81 final View rootView = getActivity().getWindow().peekDecorView(); 82 if (rootView != null) { 83 rootView.setAccessibilityPaneTitle(getString( 84 R.string.accessibility_display_inversion_preference_title)); 85 } 86 } 87 88 @Override getMetricsCategory()89 public int getMetricsCategory() { 90 return SettingsEnums.ACCESSIBILITY_COLOR_INVERSION_SETTINGS; 91 } 92 93 @Override onPreferenceToggled(String preferenceKey, boolean enabled)94 protected void onPreferenceToggled(String preferenceKey, boolean enabled) { 95 final boolean isEnabled = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; 96 if (enabled == isEnabled) { 97 return; 98 } 99 100 if (enabled) { 101 showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE); 102 } 103 logAccessibilityServiceEnabled(mComponentName, enabled); 104 Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? ON : OFF); 105 } 106 107 @Override getPreferenceScreenResId()108 protected int getPreferenceScreenResId() { 109 return R.xml.accessibility_color_inversion_settings; 110 } 111 112 @Override getLogTag()113 protected String getLogTag() { 114 return TAG; 115 } 116 117 @Override onRemoveSwitchPreferenceToggleSwitch()118 protected void onRemoveSwitchPreferenceToggleSwitch() { 119 super.onRemoveSwitchPreferenceToggleSwitch(); 120 mToggleServiceSwitchPreference.setOnPreferenceClickListener(null); 121 } 122 123 @Override updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)124 protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { 125 switchPreference.setTitle(R.string.accessibility_display_inversion_switch_title); 126 } 127 128 @Override getShortcutTitle()129 protected CharSequence getShortcutTitle() { 130 return getText(R.string.accessibility_display_inversion_shortcut_title); 131 } 132 updateFooterPreference()133 private void updateFooterPreference() { 134 final String title = getPrefContext().getString( 135 R.string.accessibility_color_inversion_about_title); 136 final String learnMoreText = getPrefContext().getString( 137 R.string.accessibility_color_inversion_footer_learn_more_content_description); 138 mFooterPreferenceController.setIntroductionTitle(title); 139 mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreText); 140 mFooterPreferenceController.displayPreference(getPreferenceScreen()); 141 } 142 143 @Override onResume()144 public void onResume() { 145 super.onResume(); 146 updateSwitchBarToggleSwitch(); 147 } 148 149 @Override onPause()150 public void onPause() { 151 super.onPause(); 152 } 153 154 @Override getHelpResource()155 public int getHelpResource() { 156 return R.string.help_url_color_inversion; 157 } 158 159 @Override getUserShortcutTypes()160 int getUserShortcutTypes() { 161 return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(), 162 mComponentName); 163 } 164 165 @Override getTileComponentName()166 ComponentName getTileComponentName() { 167 return COLOR_INVERSION_TILE_COMPONENT_NAME; 168 } 169 170 @Override getTileTooltipContent(@uickSettingsTooltipType int type)171 CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { 172 return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT 173 ? R.string.accessibility_color_inversion_qs_tooltip_content 174 : R.string.accessibility_color_inversion_auto_added_qs_tooltip_content); 175 } 176 177 @Override updateSwitchBarToggleSwitch()178 protected void updateSwitchBarToggleSwitch() { 179 final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; 180 if (mToggleServiceSwitchPreference.isChecked() == checked) { 181 return; 182 } 183 mToggleServiceSwitchPreference.setChecked(checked); 184 } 185 186 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 187 new BaseSearchIndexProvider(R.xml.accessibility_color_inversion_settings); 188 } 189