Home | History | Annotate | Download | only in accessibility
      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