The AccessibilitySettingsForSetupWizard class should not be responsible for managing the initial
logic of controllers, such as determining which controllers need to be dynamically added or updated
using setInSetupWizard APIs. This logic should be handled directly by the controllers themselves.
Bug: 311093618
Flag: EXEMPT bugfix
Test: atest AccessibilitySettingsForSetupWizardTest
AutoBrightnessPreferenceControllerForSetupWizardTest
AutoBrightnessPreferenceControllerTest
BrightnessLevelPreferenceControllerForSetupWizardTest
BrightnessLevelPreferenceControllerTest
Change-Id: I6065a10e72d002981c0f514543e6933d79c2aa1b
235 lines
9.5 KiB
Java
235 lines
9.5 KiB
Java
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings.accessibility;
|
|
|
|
import static android.app.Activity.RESULT_CANCELED;
|
|
|
|
import static com.android.settings.Utils.getAdaptiveIcon;
|
|
import static com.android.settingslib.widget.TwoTargetPreference.ICON_SIZE_MEDIUM;
|
|
|
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
|
import android.app.settings.SettingsEnums;
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.pm.ServiceInfo;
|
|
import android.graphics.Color;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Bundle;
|
|
import android.text.TextUtils;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.accessibility.AccessibilityManager;
|
|
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.preference.Preference;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import com.android.settings.R;
|
|
import com.android.settings.dashboard.DashboardFragment;
|
|
import com.android.settings.display.BrightnessLevelPreferenceControllerForSetupWizard;
|
|
import com.android.settingslib.RestrictedPreference;
|
|
import com.android.settingslib.core.AbstractPreferenceController;
|
|
|
|
import com.google.android.setupcompat.template.FooterBarMixin;
|
|
import com.google.android.setupdesign.GlifPreferenceLayout;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Activity with the accessibility settings specific to Setup Wizard.
|
|
*/
|
|
public class AccessibilitySettingsForSetupWizard extends DashboardFragment
|
|
implements Preference.OnPreferenceChangeListener {
|
|
private static final String TAG = "AccessibilitySettingsForSetupWizard";
|
|
|
|
// Preferences.
|
|
private static final String DISPLAY_MAGNIFICATION_PREFERENCE =
|
|
"screen_magnification_preference";
|
|
private static final String SCREEN_READER_PREFERENCE = "screen_reader_preference";
|
|
private static final String SELECT_TO_SPEAK_PREFERENCE = "select_to_speak_preference";
|
|
|
|
// Package names and service names used to identify screen reader and SelectToSpeak services.
|
|
@VisibleForTesting
|
|
static final String SCREEN_READER_PACKAGE_NAME = "com.google.android.marvin.talkback";
|
|
@VisibleForTesting
|
|
static final String SCREEN_READER_SERVICE_NAME =
|
|
"com.google.android.marvin.talkback.TalkBackService";
|
|
@VisibleForTesting
|
|
static final String SELECT_TO_SPEAK_PACKAGE_NAME = "com.google.android.marvin.talkback";
|
|
@VisibleForTesting
|
|
static final String SELECT_TO_SPEAK_SERVICE_NAME =
|
|
"com.google.android.accessibility.selecttospeak.SelectToSpeakService";
|
|
|
|
// Preference controls.
|
|
protected Preference mDisplayMagnificationPreference;
|
|
protected RestrictedPreference mScreenReaderPreference;
|
|
protected RestrictedPreference mSelectToSpeakPreference;
|
|
|
|
@Override
|
|
public int getMetricsCategory() {
|
|
return SettingsEnums.SUW_ACCESSIBILITY;
|
|
}
|
|
|
|
@Override
|
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
|
super.onViewCreated(view, savedInstanceState);
|
|
|
|
if (view instanceof GlifPreferenceLayout) {
|
|
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
|
|
final String title = getContext().getString(R.string.vision_settings_title);
|
|
final String description = getContext().getString(R.string.vision_settings_description);
|
|
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
|
|
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
|
|
description, icon);
|
|
|
|
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
|
|
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
|
|
() -> {
|
|
setResult(RESULT_CANCELED);
|
|
finish();
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
|
|
Bundle savedInstanceState) {
|
|
if (parent instanceof GlifPreferenceLayout) {
|
|
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
|
|
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
|
|
}
|
|
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
|
|
}
|
|
|
|
@Override
|
|
public void onCreate(Bundle icicle) {
|
|
super.onCreate(icicle);
|
|
mDisplayMagnificationPreference = findPreference(DISPLAY_MAGNIFICATION_PREFERENCE);
|
|
mScreenReaderPreference = findPreference(SCREEN_READER_PREFERENCE);
|
|
mSelectToSpeakPreference = findPreference(SELECT_TO_SPEAK_PREFERENCE);
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
updateAccessibilityServicePreference(mScreenReaderPreference,
|
|
SCREEN_READER_PACKAGE_NAME, SCREEN_READER_SERVICE_NAME);
|
|
updateAccessibilityServicePreference(mSelectToSpeakPreference,
|
|
SELECT_TO_SPEAK_PACKAGE_NAME, SELECT_TO_SPEAK_SERVICE_NAME);
|
|
}
|
|
|
|
@Override
|
|
public void onActivityCreated(Bundle savedInstanceState) {
|
|
super.onActivityCreated(savedInstanceState);
|
|
setHasOptionsMenu(false);
|
|
}
|
|
|
|
@Override
|
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onPreferenceTreeClick(Preference preference) {
|
|
if (mDisplayMagnificationPreference == preference) {
|
|
Bundle extras = mDisplayMagnificationPreference.getExtras();
|
|
extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, true);
|
|
}
|
|
|
|
return super.onPreferenceTreeClick(preference);
|
|
}
|
|
|
|
@Override
|
|
protected int getPreferenceScreenResId() {
|
|
return R.xml.accessibility_settings_for_setup_wizard;
|
|
}
|
|
|
|
@Override
|
|
protected String getLogTag() {
|
|
return TAG;
|
|
}
|
|
|
|
@Override
|
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
|
// Requires lifecycle, so added programmatically (normally via resId).
|
|
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
|
controllers.add(new BrightnessLevelPreferenceControllerForSetupWizard(
|
|
context, getSettingsLifecycle()));
|
|
return controllers;
|
|
}
|
|
|
|
/**
|
|
* Returns accessibility service info by given package name and service name.
|
|
*
|
|
* @param packageName Package of accessibility service
|
|
* @param serviceName Class of accessibility service
|
|
* @return {@link AccessibilityServiceInfo} instance if available, null otherwise.
|
|
*/
|
|
private AccessibilityServiceInfo findService(String packageName, String serviceName) {
|
|
final AccessibilityManager manager =
|
|
getActivity().getSystemService(AccessibilityManager.class);
|
|
final List<AccessibilityServiceInfo> accessibilityServices =
|
|
manager.getInstalledAccessibilityServiceList();
|
|
for (AccessibilityServiceInfo info : accessibilityServices) {
|
|
ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
|
|
if (TextUtils.equals(packageName, serviceInfo.packageName)
|
|
&& TextUtils.equals(serviceName, serviceInfo.name)) {
|
|
return info;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private void updateAccessibilityServicePreference(RestrictedPreference preference,
|
|
String packageName, String serviceName) {
|
|
final AccessibilityServiceInfo info = findService(packageName, serviceName);
|
|
if (info == null) {
|
|
getPreferenceScreen().removePreference(preference);
|
|
return;
|
|
}
|
|
|
|
final ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
|
|
final Drawable icon = info.getResolveInfo().loadIcon(getPackageManager());
|
|
preference.setIcon(getAdaptiveIcon(getContext(), icon, Color.WHITE));
|
|
preference.setIconSize(ICON_SIZE_MEDIUM);
|
|
final String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();
|
|
preference.setTitle(title);
|
|
final ComponentName componentName =
|
|
new ComponentName(serviceInfo.packageName, serviceInfo.name);
|
|
preference.setKey(componentName.flattenToString());
|
|
|
|
// Update the extras.
|
|
final Bundle extras = preference.getExtras();
|
|
extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
|
|
|
|
extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY,
|
|
preference.getKey());
|
|
extras.putString(AccessibilitySettings.EXTRA_TITLE, title);
|
|
|
|
final String description = info.loadDescription(getPackageManager());
|
|
extras.putString(AccessibilitySettings.EXTRA_SUMMARY, description);
|
|
|
|
extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());
|
|
|
|
final String htmlDescription = info.loadHtmlDescription(getPackageManager());
|
|
extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription);
|
|
}
|
|
}
|