From f736532a9d9a511bf715a8fef6e16ef0b8a1e404 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 27 Mar 2020 14:08:11 -0400 Subject: [PATCH] Only request focus if change was self-triggered For a11y we want to accomplish two things: 1. Keep focus on the button if the button was just pressed. This requires buttons in settings to be focusableInTouchMode and then request focus when the buttons are updated. 2. When the setting is changed outside of the settings page (ie: from Quick Settings), we don't want to re-announce on talkback the button that is updated on the Settings page. Therefore, to maintain #1, we add a boolean to check whether or not the updateButton change was triggered by a click to the button preference or not. Only request focus if the button was triggered by the settings button (and not when triggered by other things like QS). Test: manual Fixes: 147992252 Change-Id: I505de0585bac38a2f59062743d9d6b75861c3d32 --- ...DisplayActivationPreferenceController.java | 15 ++++++- .../ZenModeButtonPreferenceController.java | 44 ++++++++++--------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java index 533b49bd687..f68df503908 100644 --- a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java @@ -39,12 +39,17 @@ public class NightDisplayActivationPreferenceController extends TogglePreference private ColorDisplayManager mColorDisplayManager; private NightDisplayTimeFormatter mTimeFormatter; private LayoutPreference mPreference; + + // Night light can also be toggled from QS. If night light wasn't toggled by this preference, + // don't requestFocus + private boolean mButtonTriggered = false; private Button mTurnOffButton; private Button mTurnOnButton; private final OnClickListener mListener = new OnClickListener() { @Override public void onClick(View v) { + mButtonTriggered = true; mMetricsFeatureProvider.logClickedPreference(mPreference, SettingsEnums.NIGHT_DISPLAY_SETTINGS); mColorDisplayManager.setNightDisplayActivated( @@ -140,12 +145,18 @@ public class NightDisplayActivationPreferenceController extends TogglePreference mTurnOnButton.setVisibility(View.GONE); mTurnOffButton.setVisibility(View.VISIBLE); mTurnOffButton.setText(buttonText); - mTurnOffButton.requestFocus(); + if (mButtonTriggered) { + mButtonTriggered = false; + mTurnOffButton.requestFocus(); + } } else { mTurnOnButton.setVisibility(View.VISIBLE); mTurnOffButton.setVisibility(View.GONE); mTurnOnButton.setText(buttonText); - mTurnOnButton.requestFocus(); + if (mButtonTriggered) { + mButtonTriggered = false; + mTurnOnButton.requestFocus(); + } } } } diff --git a/src/com/android/settings/notification/zen/ZenModeButtonPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeButtonPreferenceController.java index a53b4fa334c..8c1f3ec033c 100644 --- a/src/com/android/settings/notification/zen/ZenModeButtonPreferenceController.java +++ b/src/com/android/settings/notification/zen/ZenModeButtonPreferenceController.java @@ -39,6 +39,9 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference private static final String TAG = "EnableZenModeButton"; private final FragmentManager mFragment; + + // DND can also be toggled from QS. If DND wasn't toggled by this preference, don't requestFocus + private boolean mButtonTriggered = false; private Button mZenButtonOn; private Button mZenButtonOff; @@ -65,7 +68,6 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference if (null == mZenButtonOn) { mZenButtonOn = ((LayoutPreference) preference) .findViewById(R.id.zen_mode_settings_turn_on_button); - mZenButtonOn.setFocusableInTouchMode(true); updateZenButtonOnClickListener(preference); } @@ -73,6 +75,7 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference mZenButtonOff = ((LayoutPreference) preference) .findViewById(R.id.zen_mode_settings_turn_off_button); mZenButtonOff.setOnClickListener(v -> { + mButtonTriggered = true; writeMetrics(preference, false); mBackend.setZenMode(Settings.Global.ZEN_MODE_OFF); }); @@ -88,38 +91,39 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS: mZenButtonOff.setVisibility(View.VISIBLE); mZenButtonOn.setVisibility(View.GONE); - mZenButtonOff.requestFocus(); + if (mButtonTriggered) { + mButtonTriggered = false; + mZenButtonOff.requestFocus(); + } break; case Settings.Global.ZEN_MODE_OFF: default: mZenButtonOff.setVisibility(View.GONE); updateZenButtonOnClickListener(preference); mZenButtonOn.setVisibility(View.VISIBLE); - mZenButtonOn.requestFocus(); + if (mButtonTriggered) { + mButtonTriggered = false; + mZenButtonOn.requestFocus(); + } } } private void updateZenButtonOnClickListener(Preference preference) { - int zenDuration = getZenDuration(); - switch (zenDuration) { - case Settings.Secure.ZEN_DURATION_PROMPT: - mZenButtonOn.setOnClickListener(v -> { - writeMetrics(preference, true); + mZenButtonOn.setOnClickListener(v -> { + mButtonTriggered = true; + writeMetrics(preference, true); + int zenDuration = getZenDuration(); + switch (zenDuration) { + case Settings.Secure.ZEN_DURATION_PROMPT: new SettingsEnableZenModeDialog().show(mFragment, TAG); - }); - break; - case Settings.Secure.ZEN_DURATION_FOREVER: - mZenButtonOn.setOnClickListener(v -> { - writeMetrics(preference, true); + break; + case Settings.Secure.ZEN_DURATION_FOREVER: mBackend.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); - }); - break; - default: - mZenButtonOn.setOnClickListener(v -> { - writeMetrics(preference, true); + break; + default: mBackend.setZenModeForDuration(zenDuration); - }); - } + } + }); } private void writeMetrics(Preference preference, boolean buttonOn) {