2 * Copyright (C) 2015 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings.accessibility;
19 import android.accessibilityservice.AccessibilityServiceInfo;
20 import android.app.settings.SettingsEnums;
21 import android.content.ComponentName;
22 import android.content.Context;
23 import android.content.pm.ServiceInfo;
24 import android.os.Bundle;
25 import android.text.TextUtils;
26 import android.view.accessibility.AccessibilityManager;
28 import androidx.preference.Preference;
30 import com.android.settings.R;
31 import com.android.settings.SettingsPreferenceFragment;
33 import java.util.List;
36 * Activity with the accessibility settings specific to Setup Wizard.
38 public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragment
39 implements Preference.OnPreferenceChangeListener {
42 private static final String DISPLAY_MAGNIFICATION_PREFERENCE =
43 "screen_magnification_preference";
44 private static final String SCREEN_READER_PREFERENCE = "screen_reader_preference";
45 private static final String SELECT_TO_SPEAK_PREFERENCE = "select_to_speak_preference";
46 private static final String FONT_SIZE_PREFERENCE = "font_size_preference";
48 // Package names and service names used to identify screen reader and SelectToSpeak services.
49 private static final String SCREEN_READER_PACKAGE_NAME = "com.google.android.marvin.talkback";
50 private static final String SCREEN_READER_SERVICE_NAME =
51 "com.google.android.marvin.talkback.TalkBackService";
52 private static final String SELECT_TO_SPEAK_PACKAGE_NAME = "com.google.android.marvin.talkback";
53 private static final String SELECT_TO_SPEAK_SERVICE_NAME =
54 "com.google.android.accessibility.selecttospeak.SelectToSpeakService";
56 // Preference controls.
57 private Preference mDisplayMagnificationPreference;
58 private Preference mScreenReaderPreference;
59 private Preference mSelectToSpeakPreference;
62 public int getMetricsCategory() {
63 return SettingsEnums.SUW_ACCESSIBILITY;
67 public void onCreate(Bundle icicle) {
68 super.onCreate(icicle);
69 addPreferencesFromResource(R.xml.accessibility_settings_for_setup_wizard);
71 mDisplayMagnificationPreference = findPreference(DISPLAY_MAGNIFICATION_PREFERENCE);
72 mScreenReaderPreference = findPreference(SCREEN_READER_PREFERENCE);
73 mSelectToSpeakPreference = findPreference(SELECT_TO_SPEAK_PREFERENCE);
77 public void onResume() {
79 updateAccessibilityServicePreference(mScreenReaderPreference,
80 findService(SCREEN_READER_PACKAGE_NAME, SCREEN_READER_SERVICE_NAME));
81 updateAccessibilityServicePreference(mSelectToSpeakPreference,
82 findService(SELECT_TO_SPEAK_PACKAGE_NAME, SELECT_TO_SPEAK_SERVICE_NAME));
83 configureMagnificationPreferenceIfNeeded(mDisplayMagnificationPreference);
87 public void onActivityCreated(Bundle savedInstanceState) {
88 super.onActivityCreated(savedInstanceState);
89 setHasOptionsMenu(false);
93 public boolean onPreferenceChange(Preference preference, Object newValue) {
98 public boolean onPreferenceTreeClick(Preference preference) {
99 if (mDisplayMagnificationPreference == preference) {
100 Bundle extras = mDisplayMagnificationPreference.getExtras();
101 extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, true);
104 return super.onPreferenceTreeClick(preference);
107 private AccessibilityServiceInfo findService(String packageName, String serviceName) {
108 final AccessibilityManager manager =
109 getActivity().getSystemService(AccessibilityManager.class);
110 final List<AccessibilityServiceInfo> accessibilityServices =
111 manager.getInstalledAccessibilityServiceList();
112 for (AccessibilityServiceInfo info : accessibilityServices) {
113 ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
114 if (packageName.equals(serviceInfo.packageName)
115 && serviceName.equals(serviceInfo.name)) {
123 private void updateAccessibilityServicePreference(Preference preference,
124 AccessibilityServiceInfo info) {
126 getPreferenceScreen().removePreference(preference);
130 ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
131 String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();
132 preference.setTitle(title);
133 ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);
134 preference.setKey(componentName.flattenToString());
136 // Update the extras.
137 Bundle extras = preference.getExtras();
138 extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
140 extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY,
141 preference.getKey());
142 extras.putString(AccessibilitySettings.EXTRA_TITLE, title);
144 String description = info.loadDescription(getPackageManager());
145 if (TextUtils.isEmpty(description)) {
146 description = getString(R.string.accessibility_service_default_description);
148 extras.putString(AccessibilitySettings.EXTRA_SUMMARY, description);
151 private static void configureMagnificationPreferenceIfNeeded(Preference preference) {
152 // Some devices support only a single magnification mode. In these cases, we redirect to
153 // the magnification mode's UI directly, rather than showing a PreferenceScreen with a
155 final Context context = preference.getContext();
156 if (!MagnificationPreferenceFragment.isApplicable(context.getResources())) {
157 preference.setFragment(
158 ToggleScreenMagnificationPreferenceFragmentForSetupWizard.class.getName());
159 final Bundle extras = preference.getExtras();
160 MagnificationGesturesPreferenceController
161 .populateMagnificationGesturesPreferenceExtras(extras, context);