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 android.app.settings.SettingsEnums; 20 import android.content.ContentResolver; 21 import android.content.Context; 22 import android.hardware.display.ColorDisplayManager; 23 import android.net.Uri; 24 import android.os.Bundle; 25 import android.os.Handler; 26 import android.provider.Settings; 27 import android.view.LayoutInflater; 28 import android.view.View; 29 import android.view.ViewGroup; 30 31 import androidx.preference.PreferenceCategory; 32 import androidx.preference.SwitchPreference; 33 34 import com.android.internal.accessibility.AccessibilityShortcutController; 35 import com.android.settings.R; 36 import com.android.settings.search.BaseSearchIndexProvider; 37 import com.android.settings.widget.SeekBarPreference; 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 for reducing brightness. */ 45 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) 46 public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePreferenceFragment { 47 48 private static final String REDUCE_BRIGHT_COLORS_ACTIVATED_KEY = 49 Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED; 50 private static final String KEY_INTENSITY = "rbc_intensity"; 51 private static final String KEY_PERSIST = "rbc_persist"; 52 53 private final Handler mHandler = new Handler(); 54 private SettingsContentObserver mSettingsContentObserver; 55 private ReduceBrightColorsIntensityPreferenceController mRbcIntensityPreferenceController; 56 private ReduceBrightColorsPersistencePreferenceController mRbcPersistencePreferenceController; 57 private ColorDisplayManager mColorDisplayManager; 58 59 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)60 public View onCreateView(LayoutInflater inflater, ViewGroup container, 61 Bundle savedInstanceState) { 62 63 mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) 64 .authority(getPrefContext().getPackageName()) 65 .appendPath(String.valueOf(R.raw.extra_dim_banner)) 66 .build(); 67 mComponentName = AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME; 68 mPackageName = getText(R.string.reduce_bright_colors_preference_title); 69 mHtmlDescription = getText(R.string.reduce_bright_colors_preference_subtitle); 70 final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1); 71 enableServiceFeatureKeys.add(REDUCE_BRIGHT_COLORS_ACTIVATED_KEY); 72 mRbcIntensityPreferenceController = 73 new ReduceBrightColorsIntensityPreferenceController(getContext(), KEY_INTENSITY); 74 mRbcPersistencePreferenceController = 75 new ReduceBrightColorsPersistencePreferenceController(getContext(), KEY_PERSIST); 76 mRbcIntensityPreferenceController.displayPreference(getPreferenceScreen()); 77 mRbcPersistencePreferenceController.displayPreference(getPreferenceScreen()); 78 mSettingsContentObserver = new SettingsContentObserver(mHandler, enableServiceFeatureKeys) { 79 @Override 80 public void onChange(boolean selfChange, Uri uri) { 81 updateSwitchBarToggleSwitch(); 82 } 83 }; 84 mColorDisplayManager = getContext().getSystemService(ColorDisplayManager.class); 85 final View view = super.onCreateView(inflater, container, savedInstanceState); 86 // Parent sets the title when creating the view, so set it after calling super 87 mToggleServiceSwitchPreference.setTitle(R.string.reduce_bright_colors_switch_title); 88 updateGeneralCategoryOrder(); 89 updateFooterPreference(); 90 return view; 91 } 92 updateGeneralCategoryOrder()93 private void updateGeneralCategoryOrder() { 94 final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY); 95 final SeekBarPreference intensity = findPreference(KEY_INTENSITY); 96 getPreferenceScreen().removePreference(intensity); 97 intensity.setOrder(mShortcutPreference.getOrder() - 2); 98 generalCategory.addPreference(intensity); 99 final SwitchPreference persist = findPreference(KEY_PERSIST); 100 getPreferenceScreen().removePreference(persist); 101 persist.setOrder(mShortcutPreference.getOrder() - 1); 102 generalCategory.addPreference(persist); 103 } 104 updateFooterPreference()105 private void updateFooterPreference() { 106 final String title = getPrefContext().getString(R.string.reduce_bright_colors_about_title); 107 mFooterPreferenceController.setIntroductionTitle(title); 108 mFooterPreferenceController.displayPreference(getPreferenceScreen()); 109 } 110 111 @Override onViewCreated(View view, Bundle savedInstanceState)112 public void onViewCreated(View view, Bundle savedInstanceState) { 113 super.onViewCreated(view, savedInstanceState); 114 } 115 116 @Override onResume()117 public void onResume() { 118 super.onResume(); 119 updateSwitchBarToggleSwitch(); 120 mSettingsContentObserver.register(getContentResolver()); 121 } 122 123 @Override onPause()124 public void onPause() { 125 mSettingsContentObserver.unregister(getContentResolver()); 126 super.onPause(); 127 } 128 129 @Override getMetricsCategory()130 public int getMetricsCategory() { 131 return SettingsEnums.REDUCE_BRIGHT_COLORS_SETTINGS; 132 } 133 134 @Override getHelpResource()135 public int getHelpResource() { 136 // TODO(170973645): Link to help support page 137 return 0; 138 } 139 140 @Override getPreferenceScreenResId()141 protected int getPreferenceScreenResId() { 142 return R.xml.reduce_bright_colors_settings; 143 } 144 145 @Override onPreferenceToggled(String preferenceKey, boolean enabled)146 protected void onPreferenceToggled(String preferenceKey, boolean enabled) { 147 AccessibilityStatsLogUtils.logAccessibilityServiceEnabled(mComponentName, enabled); 148 mColorDisplayManager.setReduceBrightColorsActivated(enabled); 149 } 150 151 @Override onRemoveSwitchPreferenceToggleSwitch()152 protected void onRemoveSwitchPreferenceToggleSwitch() { 153 super.onRemoveSwitchPreferenceToggleSwitch(); 154 mToggleServiceSwitchPreference.setOnPreferenceClickListener( 155 /* onPreferenceClickListener= */ null); 156 } 157 158 @Override updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)159 protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { 160 switchPreference.setTitle(R.string.reduce_bright_colors_preference_title); 161 } 162 163 @Override updateShortcutTitle(ShortcutPreference shortcutPreference)164 protected void updateShortcutTitle(ShortcutPreference shortcutPreference) { 165 shortcutPreference.setTitle(R.string.reduce_bright_colors_shortcut_title); 166 } 167 168 @Override getUserShortcutTypes()169 int getUserShortcutTypes() { 170 return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(), 171 mComponentName); 172 } 173 174 @Override updateSwitchBarToggleSwitch()175 protected void updateSwitchBarToggleSwitch() { 176 final boolean checked = mColorDisplayManager.isReduceBrightColorsActivated(); 177 mRbcIntensityPreferenceController.updateState(getPreferenceScreen() 178 .findPreference(KEY_INTENSITY)); 179 mRbcPersistencePreferenceController.updateState(getPreferenceScreen() 180 .findPreference(KEY_PERSIST)); 181 if (mToggleServiceSwitchPreference.isChecked() != checked) { 182 mToggleServiceSwitchPreference.setChecked(checked); 183 } 184 } 185 186 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 187 new BaseSearchIndexProvider(R.xml.reduce_bright_colors_settings) { 188 @Override 189 protected boolean isPageSearchEnabled(Context context) { 190 return ColorDisplayManager.isReduceBrightColorsAvailable(context); 191 } 192 }; 193 } 194