1 /* 2 * Copyright (C) 2017 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.tv.settings.accessibility; 18 19 import android.accessibilityservice.AccessibilityServiceInfo; 20 import android.content.ComponentName; 21 import android.content.pm.ServiceInfo; 22 import android.os.Bundle; 23 import android.provider.Settings; 24 import android.support.annotation.Keep; 25 import android.support.v14.preference.SwitchPreference; 26 import android.support.v7.preference.Preference; 27 import android.support.v7.preference.PreferenceGroup; 28 import android.support.v7.preference.TwoStatePreference; 29 import android.text.TextUtils; 30 import android.view.accessibility.AccessibilityManager; 31 32 import com.android.internal.logging.nano.MetricsProto; 33 import com.android.settingslib.accessibility.AccessibilityUtils; 34 import com.android.tv.settings.R; 35 import com.android.tv.settings.SettingsPreferenceFragment; 36 37 import java.util.List; 38 import java.util.Set; 39 40 /** 41 * Fragment for Accessibility settings 42 */ 43 @Keep 44 public class AccessibilityFragment extends SettingsPreferenceFragment { 45 private static final String TOGGLE_HIGH_TEXT_CONTRAST_KEY = "toggle_high_text_contrast"; 46 private static final String ACCESSIBILITY_SERVICES_KEY = "system_accessibility_services"; 47 48 private PreferenceGroup mServicesPref; 49 50 /** 51 * Create a new instance of the fragment 52 * @return New fragment instance 53 */ 54 public static AccessibilityFragment newInstance() { 55 return new AccessibilityFragment(); 56 } 57 58 @Override 59 public void onResume() { 60 super.onResume(); 61 if (mServicesPref != null) { 62 refreshServices(mServicesPref); 63 } 64 } 65 66 @Override 67 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 68 setPreferencesFromResource(R.xml.accessibility, null); 69 70 final TwoStatePreference highContrastPreference = 71 (TwoStatePreference) findPreference(TOGGLE_HIGH_TEXT_CONTRAST_KEY); 72 highContrastPreference.setChecked(Settings.Secure.getInt(getContext().getContentResolver(), 73 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1); 74 75 mServicesPref = (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_KEY); 76 refreshServices(mServicesPref); 77 } 78 79 @Override 80 public boolean onPreferenceTreeClick(Preference preference) { 81 if (TextUtils.equals(preference.getKey(), TOGGLE_HIGH_TEXT_CONTRAST_KEY)) { 82 Settings.Secure.putInt(getActivity().getContentResolver(), 83 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 84 (((SwitchPreference) preference).isChecked() ? 1 : 0)); 85 return true; 86 } else { 87 return super.onPreferenceTreeClick(preference); 88 } 89 } 90 91 private void refreshServices(PreferenceGroup group) { 92 final List<AccessibilityServiceInfo> installedServiceInfos = 93 getActivity().getSystemService(AccessibilityManager.class) 94 .getInstalledAccessibilityServiceList(); 95 final Set<ComponentName> enabledServices = 96 AccessibilityUtils.getEnabledServicesFromSettings(getActivity()); 97 final boolean accessibilityEnabled = Settings.Secure.getInt( 98 getActivity().getContentResolver(), 99 Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; 100 101 for (final AccessibilityServiceInfo accInfo : installedServiceInfos) { 102 final ServiceInfo serviceInfo = accInfo.getResolveInfo().serviceInfo; 103 final ComponentName componentName = new ComponentName(serviceInfo.packageName, 104 serviceInfo.name); 105 106 final boolean serviceEnabled = accessibilityEnabled 107 && enabledServices.contains(componentName); 108 109 final String title = accInfo.getResolveInfo() 110 .loadLabel(getActivity().getPackageManager()).toString(); 111 112 final String key = "ServicePref:" + componentName.flattenToString(); 113 Preference servicePref = findPreference(key); 114 if (servicePref == null) { 115 servicePref = new Preference(group.getContext()); 116 servicePref.setKey(key); 117 } 118 servicePref.setTitle(title); 119 servicePref.setSummary(serviceEnabled ? R.string.settings_on : R.string.settings_off); 120 servicePref.setFragment(AccessibilityServiceFragment.class.getName()); 121 AccessibilityServiceFragment.prepareArgs(servicePref.getExtras(), 122 serviceInfo.packageName, 123 serviceInfo.name, 124 accInfo.getSettingsActivityName(), 125 title); 126 group.addPreference(servicePref); 127 } 128 } 129 130 @Override 131 public int getMetricsCategory() { 132 return MetricsProto.MetricsEvent.ACCESSIBILITY; 133 } 134 } 135