Merge "a11y: Clean up magnification mode controller and fix lint errors" into main

This commit is contained in:
Yongshun Liu
2025-02-18 17:28:49 -08:00
committed by Android (Google) Code Review
6 changed files with 204 additions and 146 deletions

View File

@@ -24,6 +24,7 @@ import android.content.DialogInterface;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ScrollView;
@@ -34,14 +35,15 @@ import androidx.appcompat.app.AlertDialog;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Optional;
/**
* Utility class for creating the edit dialog.
*/
public class AccessibilityDialogUtils {
private static final String TAG = "AccessibilityDialogUtils";
private static final String TAG = AccessibilityDialogUtils.class.getSimpleName();
/** Denotes the dialog emuns for show dialog. */
/** Denotes the dialog enums for show dialog. */
@Retention(RetentionPolicy.SOURCE)
public @interface DialogEnums {
/**
@@ -89,6 +91,19 @@ public class AccessibilityDialogUtils {
* OPEN: Settings > Accessibility > Display size and text > Click 'Reset settings' button.
*/
int DIALOG_RESET_SETTINGS = 1009;
/**
* OPEN: Settings > Accessibility > Magnification > Magnification type.
*/
int DIALOG_MAGNIFICATION_MODE = 1010;
/**
* Enable: Settings > Accessibility > Magnification > Magnification shortcut > Advanced >
* Triple tap.
* OPEN: Settings > Accessibility > Magnification > Magnification type > Magnify part of
* screen / Switch between full and partial screen > Save.
*/
int DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING = 1011;
}
/**
@@ -118,17 +133,26 @@ public class AccessibilityDialogUtils {
* is clicked
* @return the {@link Dialog} with the given view
*/
public static Dialog createCustomDialog(Context context, CharSequence dialogTitle,
View customView, CharSequence positiveButtonText,
DialogInterface.OnClickListener positiveListener, CharSequence negativeButtonText,
DialogInterface.OnClickListener negativeListener) {
final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(customView)
@NonNull
public static Dialog createCustomDialog(@NonNull Context context,
@NonNull CharSequence dialogTitle, @Nullable View customView,
@NonNull CharSequence positiveButtonText,
@Nullable DialogInterface.OnClickListener positiveListener,
@NonNull CharSequence negativeButtonText,
@Nullable DialogInterface.OnClickListener negativeListener) {
DialogInterface.OnClickListener doNothingListener =
(DialogInterface dialogInterface, int which) -> {};
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context)
.setTitle(dialogTitle)
.setCancelable(true)
.setPositiveButton(positiveButtonText, positiveListener)
.setNegativeButton(negativeButtonText, negativeListener)
.create();
.setPositiveButton(positiveButtonText,
Optional.ofNullable(positiveListener).orElse(doNothingListener))
.setNegativeButton(negativeButtonText,
Optional.ofNullable(negativeListener).orElse(doNothingListener));
if (customView != null) {
dialogBuilder.setView(customView);
}
final AlertDialog alertDialog = dialogBuilder.create();
if (customView instanceof ScrollView || customView instanceof AbsListView) {
setScrollIndicators(customView);
}
@@ -151,8 +175,7 @@ public class AccessibilityDialogUtils {
list.setId(android.R.id.list);
list.setDivider(/* divider= */ null);
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
final ItemInfoArrayAdapter
adapter = new ItemInfoArrayAdapter(context, itemInfoList);
final ListAdapter adapter = new ItemInfoArrayAdapter<>(context, itemInfoList);
list.setAdapter(adapter);
list.setOnItemClickListener(itemListener);
return list;

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) 2025 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;
/**
* The {@code DialogHelper} interface provides methods for displaying dialogs.
* It helps the dialog delegate to show the dialog, and will be injected to the dialog delegate.
*/
public interface DialogHelper {
/**
* Shows a dialog with the specified dialog ID.
*
* @param dialogId The ID of the dialog to display.
*/
void showDialog(int dialogId);
}

View File

@@ -37,11 +37,13 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.util.Preconditions;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.utils.AnnotationSpan;
@@ -57,33 +59,37 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
DialogCreatable, LifecycleObserver, OnCreate, OnSaveInstanceState {
static final String PREF_KEY = "screen_magnification_mode";
private static final int DIALOG_ID_BASE = 10;
@VisibleForTesting
static final int DIALOG_MAGNIFICATION_MODE = DIALOG_ID_BASE + 1;
@VisibleForTesting
static final int DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING = DIALOG_ID_BASE + 2;
@VisibleForTesting
static final String EXTRA_MODE = "mode";
private static final String TAG = "MagnificationModePreferenceController";
private static final String TAG = MagnificationModePreferenceController.class.getSimpleName();
@Nullable
private DialogHelper mDialogHelper;
// The magnification mode in the dialog.
@MagnificationMode
private int mModeCache = MagnificationMode.NONE;
@Nullable
private Preference mModePreference;
@Nullable
private ShortcutPreference mLinkPreference;
@VisibleForTesting
@Nullable
ListView mMagnificationModesListView;
private final List<MagnificationModeInfo> mModeInfos = new ArrayList<>();
public MagnificationModePreferenceController(Context context, String preferenceKey) {
public MagnificationModePreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
super(context, preferenceKey);
initModeInfos();
}
public void setDialogHelper(@NonNull DialogHelper dialogHelper) {
mDialogHelper = dialogHelper;
}
private void initModeInfos() {
mModeInfos.add(new MagnificationModeInfo(mContext.getText(
R.string.accessibility_magnification_mode_dialog_option_full_screen), null,
@@ -103,6 +109,7 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
return AVAILABLE;
}
@NonNull
@Override
public CharSequence getSummary() {
final int capabilities = MagnificationCapabilities.getCapabilities(mContext);
@@ -110,99 +117,98 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
}
@Override
public void onCreate(Bundle savedInstanceState) {
public void onCreate(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null) {
mModeCache = savedInstanceState.getInt(EXTRA_MODE, MagnificationMode.NONE);
}
}
@Override
public void displayPreference(PreferenceScreen screen) {
public void displayPreference(@NonNull PreferenceScreen screen) {
super.displayPreference(screen);
mModePreference = screen.findPreference(getPreferenceKey());
mLinkPreference = screen.findPreference(
ToggleFeaturePreferenceFragment.KEY_SHORTCUT_PREFERENCE);
mModePreference.setOnPreferenceClickListener(preference -> {
Preconditions.checkNotNull(mModePreference).setOnPreferenceClickListener(preference -> {
mModeCache = MagnificationCapabilities.getCapabilities(mContext);
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE);
Preconditions.checkNotNull(mDialogHelper).showDialog(
DialogEnums.DIALOG_MAGNIFICATION_MODE);
return true;
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putInt(EXTRA_MODE, mModeCache);
}
/**
* Sets {@link DialogHelper} used to show the dialog.
*/
public void setDialogHelper(DialogHelper dialogHelper) {
mDialogHelper = dialogHelper;
mDialogHelper.setDialogDelegate(this);
}
@NonNull
@Override
public Dialog onCreateDialog(int dialogId) {
switch (dialogId) {
case DIALOG_MAGNIFICATION_MODE:
return createMagnificationModeDialog();
case DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return createMagnificationTripleTapWarningDialog();
}
return null;
return switch (dialogId) {
case DialogEnums.DIALOG_MAGNIFICATION_MODE -> createMagnificationModeDialog();
case DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING ->
createMagnificationTripleTapWarningDialog();
default -> throw new IllegalArgumentException(
"This only handles magnification mode and triple tap warning dialog");
};
}
@Override
public int getDialogMetricsCategory(int dialogId) {
switch (dialogId) {
case DIALOG_MAGNIFICATION_MODE:
return SettingsEnums.DIALOG_MAGNIFICATION_CAPABILITY;
case DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return SettingsEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING;
default:
return 0;
}
return switch (dialogId) {
case DialogEnums.DIALOG_MAGNIFICATION_MODE ->
SettingsEnums.DIALOG_MAGNIFICATION_CAPABILITY;
case DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING ->
SettingsEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING;
default -> 0;
};
}
@NonNull
private ListView getMagnificationModesListView() {
return Preconditions.checkNotNull(mMagnificationModesListView);
}
@NonNull
private Dialog createMagnificationModeDialog() {
mMagnificationModesListView = AccessibilityDialogUtils.createSingleChoiceListView(
mContext, mModeInfos, this::onMagnificationModeSelected);
final View headerView = LayoutInflater.from(mContext).inflate(
R.layout.accessibility_magnification_mode_header, mMagnificationModesListView,
false);
mMagnificationModesListView.addHeaderView(headerView, /* data= */ null, /* isSelectable= */
false);
R.layout.accessibility_magnification_mode_header,
getMagnificationModesListView(), /* attachToRoot= */false);
getMagnificationModesListView().addHeaderView(headerView, /* data= */null,
/* isSelectable= */false);
mMagnificationModesListView.setItemChecked(computeSelectionIndex(), true);
getMagnificationModesListView().setItemChecked(computeSelectionIndex(), /* value= */true);
final CharSequence title = mContext.getString(
R.string.accessibility_magnification_mode_dialog_title);
final CharSequence positiveBtnText = mContext.getString(R.string.save);
final CharSequence negativeBtnText = mContext.getString(R.string.cancel);
return AccessibilityDialogUtils.createCustomDialog(mContext, title,
mMagnificationModesListView,
positiveBtnText, this::onMagnificationModeDialogPositiveButtonClicked,
negativeBtnText, /* negativeListener= */ null);
getMagnificationModesListView(), positiveBtnText,
this::onMagnificationModeDialogPositiveButtonClicked,
negativeBtnText, /* negativeListener= */null);
}
@VisibleForTesting
void onMagnificationModeDialogPositiveButtonClicked(DialogInterface dialogInterface,
void onMagnificationModeDialogPositiveButtonClicked(@NonNull DialogInterface dialogInterface,
int which) {
final int selectedIndex = mMagnificationModesListView.getCheckedItemPosition();
final int selectedIndex = getMagnificationModesListView().getCheckedItemPosition();
if (selectedIndex == AdapterView.INVALID_POSITION) {
Log.w(TAG, "invalid index");
Log.w(TAG, "Selected positive button with INVALID_POSITION index");
return;
}
mModeCache = ((MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition(
selectedIndex)).mMagnificationMode;
mModeCache = ((MagnificationModeInfo) getMagnificationModesListView().getItemAtPosition(
selectedIndex)).mMagnificationMode;
// Do not save mode until user clicks positive button in triple tap warning dialog.
if (isTripleTapEnabled(mContext) && mModeCache != MagnificationMode.FULLSCREEN) {
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
Preconditions.checkNotNull(mDialogHelper).showDialog(
DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
} else { // Save mode (capabilities) value, don't need to show dialog to confirm.
updateCapabilitiesAndSummary(mModeCache);
}
@@ -211,15 +217,14 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
private void updateCapabilitiesAndSummary(@MagnificationMode int mode) {
mModeCache = mode;
MagnificationCapabilities.setCapabilities(mContext, mModeCache);
mModePreference.setSummary(
Preconditions.checkNotNull(mModePreference).setSummary(
MagnificationCapabilities.getSummary(mContext, mModeCache));
}
private void onMagnificationModeSelected(AdapterView<?> parent, View view, int position,
long id) {
private void onMagnificationModeSelected(@NonNull AdapterView<?> parent, @NonNull View view,
int position, long id) {
final MagnificationModeInfo modeInfo =
(MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition(
position);
(MagnificationModeInfo) getMagnificationModesListView().getItemAtPosition(position);
if (modeInfo.mMagnificationMode == mModeCache) {
return;
}
@@ -230,20 +235,22 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
final int modesSize = mModeInfos.size();
for (int i = 0; i < modesSize; i++) {
if (mModeInfos.get(i).mMagnificationMode == mModeCache) {
return i + mMagnificationModesListView.getHeaderViewsCount();
return i + getMagnificationModesListView().getHeaderViewsCount();
}
}
Log.w(TAG, "computeSelectionIndex failed");
Log.w(TAG, "Can not find matching mode in mModeInfos");
return 0;
}
@VisibleForTesting
static boolean isTripleTapEnabled(Context context) {
static boolean isTripleTapEnabled(@NonNull Context context) {
return Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON;
}
@NonNull
private Dialog createMagnificationTripleTapWarningDialog() {
@SuppressWarnings({"InflateParams"})
final View contentView = LayoutInflater.from(mContext).inflate(
R.layout.magnification_triple_tap_warning_dialog, /* root= */ null);
final CharSequence title = mContext.getString(
@@ -263,12 +270,13 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
return dialog;
}
private void updateLinkInTripleTapWarningDialog(Dialog dialog, View contentView) {
private void updateLinkInTripleTapWarningDialog(@NonNull Dialog dialog,
@NonNull View contentView) {
final TextView messageView = contentView.findViewById(R.id.message);
// TODO(b/225682559): Need to remove performClick() after refactoring accessibility dialog.
final View.OnClickListener linkListener = view -> {
updateCapabilitiesAndSummary(mModeCache);
mLinkPreference.performClick();
Preconditions.checkNotNull(mLinkPreference).performClick();
dialog.dismiss();
};
final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo(
@@ -285,25 +293,18 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
@VisibleForTesting
void onMagnificationTripleTapWarningDialogNegativeButtonClicked(
DialogInterface dialogInterface, int which) {
@NonNull DialogInterface dialogInterface, int which) {
mModeCache = MagnificationCapabilities.getCapabilities(mContext);
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE);
Preconditions.checkNotNull(mDialogHelper).showDialog(
DialogEnums.DIALOG_MAGNIFICATION_MODE);
}
@VisibleForTesting
void onMagnificationTripleTapWarningDialogPositiveButtonClicked(
DialogInterface dialogInterface, int which) {
@NonNull DialogInterface dialogInterface, int which) {
updateCapabilitiesAndSummary(mModeCache);
}
/**
* An interface to help the delegate to show the dialog. It will be injected to the delegate.
*/
interface DialogHelper extends DialogCreatable {
void showDialog(int dialogId);
void setDialogDelegate(DialogCreatable delegate);
}
@VisibleForTesting
static class MagnificationModeInfo extends ItemInfoArrayAdapter.ItemInfo {
@MagnificationMode

View File

@@ -19,7 +19,6 @@ package com.android.settings.accessibility;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT;
import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.AccessibilityUtil.getShortcutSummaryList;
@@ -42,8 +41,10 @@ import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.util.Preconditions;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.SwitchPreferenceCompat;
@@ -53,6 +54,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.Flags;
import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -74,10 +76,10 @@ import java.util.stream.Stream;
*/
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class ToggleScreenMagnificationPreferenceFragment extends
ToggleFeaturePreferenceFragment implements
MagnificationModePreferenceController.DialogHelper {
ToggleFeaturePreferenceFragment implements DialogHelper {
private static final String TAG = "ToggleScreenMagnificationPreferenceFragment";
private static final String TAG =
ToggleScreenMagnificationPreferenceFragment.class.getSimpleName();
@VisibleForTesting
static final String KEY_MAGNIFICATION_SHORTCUT_PREFERENCE = "magnification_shortcut_preference";
private static final char COMPONENT_NAME_SEPARATOR = ':';
@@ -86,23 +88,30 @@ public class ToggleScreenMagnificationPreferenceFragment extends
// TODO(b/147021230): Move duplicated functions with android/internal/accessibility into util.
private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
private DialogCreatable mDialogDelegate;
@Nullable
private DialogCreatable mMagnificationModeDialogDelegate;
@Nullable
MagnificationOneFingerPanningPreferenceController mOneFingerPanningPreferenceController;
private boolean mInSetupWizard;
@VisibleForTesting
public void setMagnificationModeDialogDelegate(@NonNull DialogCreatable delegate) {
mMagnificationModeDialogDelegate = delegate;
}
@Override
public void onCreate(Bundle savedInstanceState) {
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(R.string.accessibility_screen_magnification_title);
mInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
}
@NonNull
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@NonNull Bundle savedInstanceState) {
mFeatureName = getString(R.string.accessibility_screen_magnification_title);
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(getPrefContext().getPackageName())
@@ -161,15 +170,14 @@ public class ToggleScreenMagnificationPreferenceFragment extends
super.onPause();
}
@NonNull
@Override
public Dialog onCreateDialog(int dialogId) {
if (mDialogDelegate != null) {
mDialog = mDialogDelegate.onCreateDialog(dialogId);
if (mDialog != null) {
return mDialog;
}
}
switch (dialogId) {
case DialogEnums.DIALOG_MAGNIFICATION_MODE:
case DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return Preconditions.checkNotNull(mMagnificationModeDialogDelegate)
.onCreateDialog(dialogId);
case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
return AccessibilityShortcutsTutorial
.showAccessibilityGestureTutorialDialog(getPrefContext());
@@ -238,9 +246,10 @@ public class ToggleScreenMagnificationPreferenceFragment extends
generalCategory.addPreference(mSettingsPreference);
final MagnificationModePreferenceController magnificationModePreferenceController =
new MagnificationModePreferenceController(getContext(),
new MagnificationModePreferenceController(Preconditions.checkNotNull(getContext()),
MagnificationModePreferenceController.PREF_KEY);
magnificationModePreferenceController.setDialogHelper(this);
magnificationModePreferenceController.setDialogHelper(/* dialogHelper= */this);
mMagnificationModeDialogDelegate = magnificationModePreferenceController;
getSettingsLifecycle().addObserver(magnificationModePreferenceController);
magnificationModePreferenceController.displayPreference(getPreferenceScreen());
addPreferenceController(magnificationModePreferenceController);
@@ -388,11 +397,6 @@ public class ToggleScreenMagnificationPreferenceFragment extends
super.showDialog(dialogId);
}
@Override
public void setDialogDelegate(DialogCreatable delegate) {
mDialogDelegate = delegate;
}
@Override
protected void registerKeysToObserverCallback(
AccessibilitySettingsContentObserver contentObserver) {
@@ -470,14 +474,11 @@ public class ToggleScreenMagnificationPreferenceFragment extends
@Override
public int getDialogMetricsCategory(int dialogId) {
if (mDialogDelegate != null) {
final int category = mDialogDelegate.getDialogMetricsCategory(dialogId);
if (category != 0) {
return category;
}
}
switch (dialogId) {
case DialogEnums.DIALOG_MAGNIFICATION_MODE:
case DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return Preconditions.checkNotNull(mMagnificationModeDialogDelegate)
.getDialogMetricsCategory(dialogId);
case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
return SettingsEnums.DIALOG_TOGGLE_SCREEN_MAGNIFICATION_GESTURE_NAVIGATION;
case DialogEnums.ACCESSIBILITY_BUTTON_TUTORIAL:
@@ -514,7 +515,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
}
@Override
public void onToggleClicked(ShortcutPreference preference) {
public void onToggleClicked(@NonNull ShortcutPreference preference) {
final int shortcutTypes = getUserPreferredShortcutTypes();
getPrefContext().getSystemService(AccessibilityManager.class).enableShortcutsForTargets(
preference.isChecked(), shortcutTypes,
@@ -527,7 +528,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
}
@Override
public void onSettingsClicked(ShortcutPreference preference) {
public void onSettingsClicked(@NonNull ShortcutPreference preference) {
EditShortcutsPreferenceFragment.showEditShortcutScreen(
requireContext(),
getMetricsCategory(),
@@ -581,7 +582,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends
*
* @param context The current context.
*/
public static CharSequence getServiceSummary(Context context) {
@NonNull
public static CharSequence getServiceSummary(@NonNull Context context) {
// Get the user shortcut type from settings provider.
final int userShortcutType = ShortcutUtils.getEnabledShortcutTypes(
context, MAGNIFICATION_CONTROLLER_NAME);
@@ -604,8 +606,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
// LINT.IfChange(search_data)
@NonNull
@Override
public List<SearchIndexableRaw> getRawDataToIndex(Context context,
public List<SearchIndexableRaw> getRawDataToIndex(@NonNull Context context,
boolean enabled) {
final List<SearchIndexableRaw> rawData =
super.getRawDataToIndex(context, enabled);
@@ -628,8 +631,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends
return rawData;
}
@NonNull
@Override
public List<String> getNonIndexableKeys(Context context) {
public List<String> getNonIndexableKeys(@NonNull Context context) {
final List<String> niks = super.getNonIndexableKeys(context);
if (!com.android.settings.accessibility.Flags.fixA11ySettingsSearch()) {

View File

@@ -17,8 +17,6 @@
package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import static com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo;
import static com.google.common.truth.Truth.assertThat;
@@ -37,6 +35,7 @@ import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -44,6 +43,9 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo;
import com.android.settings.utils.AnnotationSpan;
import org.junit.Before;
@@ -82,6 +84,8 @@ public class MagnificationModePreferenceControllerTest {
mScreen.addPreference(mModePreference);
MagnificationCapabilities.setCapabilities(mContext, MAGNIFICATION_MODE_DEFAULT);
mController = new MagnificationModePreferenceController(mContext, PREF_KEY);
mController.setDialogHelper(mDialogHelper);
mDialogHelper.setDialogDelegate(mController);
showPreferenceOnTheScreen(null);
}
@@ -107,7 +111,7 @@ public class MagnificationModePreferenceControllerTest {
performItemClickWith(MagnificationMode.WINDOW);
reshowPreferenceOnTheScreen();
mDialogHelper.showDialog(MagnificationModePreferenceController.DIALOG_MAGNIFICATION_MODE);
mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_MODE);
assertThat(getCheckedModeFromDialog()).isEqualTo(
MagnificationMode.WINDOW);
@@ -123,7 +127,7 @@ public class MagnificationModePreferenceControllerTest {
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper, never()).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
}
@Test
@@ -135,8 +139,7 @@ public class MagnificationModePreferenceControllerTest {
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
}
@Test
@@ -148,20 +151,17 @@ public class MagnificationModePreferenceControllerTest {
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
}
@Test
public void onTripleTapWarningDialogNegativeButtonClicked_showModeDialog() {
mDialogHelper.showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
mController.onMagnificationTripleTapWarningDialogNegativeButtonClicked(
mDialogHelper.getDialog(), DialogInterface.BUTTON_NEGATIVE);
verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_MODE);
verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_MODE);
}
@Test
@@ -182,8 +182,7 @@ public class MagnificationModePreferenceControllerTest {
@Test
public void checkSpansInTripleTapWarningDialog_existAnnotationSpan() {
mDialogHelper.showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
final View contentView = mDialogHelper.getDialog().findViewById(android.R.id.content);
final TextView messageView = contentView.findViewById(R.id.message);
final CharSequence textInTripleTapWarningDialog = messageView.getText();
@@ -256,13 +255,11 @@ public class MagnificationModePreferenceControllerTest {
}
private void showPreferenceOnTheScreen(Bundle savedInstanceState) {
mController.setDialogHelper(mDialogHelper);
mController.onCreate(savedInstanceState);
mController.displayPreference(mScreen);
}
private static class TestDialogHelper implements DialogCreatable,
MagnificationModePreferenceController.DialogHelper {
private static class TestDialogHelper implements DialogCreatable, DialogHelper {
private DialogCreatable mDialogDelegate;
private Dialog mDialog;
@@ -271,11 +268,11 @@ public class MagnificationModePreferenceControllerTest {
mDialog = onCreateDialog(dialogId);
}
@Override
public void setDialogDelegate(DialogCreatable delegate) {
public void setDialogDelegate(@NonNull DialogCreatable delegate) {
mDialogDelegate = delegate;
}
@NonNull
@Override
public Dialog onCreateDialog(int dialogId) {
return mDialogDelegate.onCreateDialog(dialogId);

View File

@@ -64,6 +64,8 @@ import com.android.server.accessibility.Flags;
import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import com.android.settings.testutils.shadow.ShadowAccessibilityManager;
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
import com.android.settings.testutils.shadow.ShadowStorageManager;
@@ -550,7 +552,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest {
ToggleScreenMagnificationPreferenceFragment fragment = mFragController.create(
R.id.main_content, /* bundle= */ null).start().resume().get();
DialogCreatable dialogDelegate = ReflectionHelpers.getField(fragment, "mDialogDelegate");
DialogCreatable dialogDelegate = ReflectionHelpers.getField(fragment,
"mMagnificationModeDialogDelegate");
List<LifecycleObserver> lifecycleObservers = ReflectionHelpers.getField(
fragment.getSettingsLifecycle(), "mObservers");
assertThat(dialogDelegate).isInstanceOf(MagnificationModePreferenceController.class);
@@ -592,19 +595,19 @@ public class ToggleScreenMagnificationPreferenceFragmentTest {
}
@Test
public void onCreateDialog_setDialogDelegate_invokeDialogDelegate() {
public void onCreateDialog_setMagnificationModeDialogDelegate_invokeDialogDelegate() {
ToggleScreenMagnificationPreferenceFragment fragment =
mFragController.create(
R.id.main_content, /* bundle= */ null).start().resume().get();
final DialogCreatable dialogDelegate = mock(DialogCreatable.class, RETURNS_DEEP_STUBS);
when(dialogDelegate.getDialogMetricsCategory(anyInt())).thenReturn(1);
fragment.setDialogDelegate(dialogDelegate);
final int dialogId = DialogEnums.DIALOG_MAGNIFICATION_MODE;
when(dialogDelegate.getDialogMetricsCategory(anyInt())).thenReturn(dialogId);
fragment.setMagnificationModeDialogDelegate(dialogDelegate);
fragment.onCreateDialog(1);
fragment.getDialogMetricsCategory(1);
verify(dialogDelegate).onCreateDialog(1);
verify(dialogDelegate).getDialogMetricsCategory(1);
fragment.onCreateDialog(dialogId);
fragment.getDialogMetricsCategory(dialogId);
verify(dialogDelegate).onCreateDialog(dialogId);
verify(dialogDelegate).getDialogMetricsCategory(dialogId);
}
@Test