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.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.ContentResolver;
26 import android.net.Uri;
27 import android.os.Bundle;
28 import android.os.Handler;
29 import android.provider.Settings;
30 import android.view.LayoutInflater;
31 import android.view.View;
32 import android.view.ViewGroup;
33 
34 import com.android.settings.R;
35 import com.android.settings.widget.SettingsMainSwitchPreference;
36 
37 import java.util.ArrayList;
38 import java.util.List;
39 
40 /** Settings page for color inversion. */
41 public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePreferenceFragment {
42 
43     private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED;
44     private final Handler mHandler = new Handler();
45     private SettingsContentObserver mSettingsContentObserver;
46 
47     @Override
getMetricsCategory()48     public int getMetricsCategory() {
49         return SettingsEnums.ACCESSIBILITY_COLOR_INVERSION_SETTINGS;
50     }
51 
52     @Override
onPreferenceToggled(String preferenceKey, boolean enabled)53     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
54         logAccessibilityServiceEnabled(mComponentName, enabled);
55         Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? ON : OFF);
56     }
57 
58     @Override
getPreferenceScreenResId()59     protected int getPreferenceScreenResId() {
60         return R.xml.accessibility_color_inversion_settings;
61     }
62 
63     @Override
onRemoveSwitchPreferenceToggleSwitch()64     protected void onRemoveSwitchPreferenceToggleSwitch() {
65         super.onRemoveSwitchPreferenceToggleSwitch();
66         mToggleServiceSwitchPreference.setOnPreferenceClickListener(null);
67     }
68 
69     @Override
updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference)70     protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
71         switchPreference.setTitle(R.string.accessibility_display_inversion_switch_title);
72     }
73 
74     @Override
updateShortcutTitle(ShortcutPreference shortcutPreference)75     protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
76         shortcutPreference.setTitle(R.string.accessibility_display_inversion_shortcut_title);
77     }
78 
79     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)80     public View onCreateView(LayoutInflater inflater, ViewGroup container,
81             Bundle savedInstanceState) {
82         mComponentName = COLOR_INVERSION_COMPONENT_NAME;
83         mPackageName = getText(R.string.accessibility_display_inversion_preference_title);
84         mHtmlDescription = getText(R.string.accessibility_display_inversion_preference_subtitle);
85         mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
86                 .authority(getPrefContext().getPackageName())
87                 .appendPath(String.valueOf(R.raw.accessibility_color_inversion_banner))
88                 .build();
89         final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
90         enableServiceFeatureKeys.add(ENABLED);
91         mSettingsContentObserver = new SettingsContentObserver(mHandler, enableServiceFeatureKeys) {
92             @Override
93             public void onChange(boolean selfChange, Uri uri) {
94                 updateSwitchBarToggleSwitch();
95             }
96         };
97 
98         final View view = super.onCreateView(inflater, container, savedInstanceState);
99         updateFooterPreference();
100         return view;
101     }
102 
updateFooterPreference()103     private void updateFooterPreference() {
104         final String title = getPrefContext().getString(
105                 R.string.accessibility_color_inversion_about_title);
106         final String learnMoreContentDescription = getPrefContext().getString(
107                 R.string.accessibility_color_inversion_footer_learn_more_content_description);
108         mFooterPreferenceController.setIntroductionTitle(title);
109         mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreContentDescription);
110         mFooterPreferenceController.displayPreference(getPreferenceScreen());
111     }
112 
113     @Override
onResume()114     public void onResume() {
115         super.onResume();
116         updateSwitchBarToggleSwitch();
117         mSettingsContentObserver.register(getContentResolver());
118     }
119 
120     @Override
onPause()121     public void onPause() {
122         mSettingsContentObserver.unregister(getContentResolver());
123         super.onPause();
124     }
125 
126     @Override
getHelpResource()127     public int getHelpResource() {
128         return R.string.help_url_color_inversion;
129     }
130 
131     @Override
getUserShortcutTypes()132     int getUserShortcutTypes() {
133         return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
134                 mComponentName);
135     }
136 
137     @Override
updateSwitchBarToggleSwitch()138     protected void updateSwitchBarToggleSwitch() {
139         final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON;
140         if (mToggleServiceSwitchPreference.isChecked() == checked) {
141             return;
142         }
143         mToggleServiceSwitchPreference.setChecked(checked);
144     }
145 }
146