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