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
This commit is contained in:
Beverly
2020-03-27 14:08:11 -04:00
parent 50aeb48c56
commit f736532a9d
2 changed files with 37 additions and 22 deletions

View File

@@ -39,12 +39,17 @@ public class NightDisplayActivationPreferenceController extends TogglePreference
private ColorDisplayManager mColorDisplayManager; private ColorDisplayManager mColorDisplayManager;
private NightDisplayTimeFormatter mTimeFormatter; private NightDisplayTimeFormatter mTimeFormatter;
private LayoutPreference mPreference; 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 mTurnOffButton;
private Button mTurnOnButton; private Button mTurnOnButton;
private final OnClickListener mListener = new OnClickListener() { private final OnClickListener mListener = new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
mButtonTriggered = true;
mMetricsFeatureProvider.logClickedPreference(mPreference, mMetricsFeatureProvider.logClickedPreference(mPreference,
SettingsEnums.NIGHT_DISPLAY_SETTINGS); SettingsEnums.NIGHT_DISPLAY_SETTINGS);
mColorDisplayManager.setNightDisplayActivated( mColorDisplayManager.setNightDisplayActivated(
@@ -140,12 +145,18 @@ public class NightDisplayActivationPreferenceController extends TogglePreference
mTurnOnButton.setVisibility(View.GONE); mTurnOnButton.setVisibility(View.GONE);
mTurnOffButton.setVisibility(View.VISIBLE); mTurnOffButton.setVisibility(View.VISIBLE);
mTurnOffButton.setText(buttonText); mTurnOffButton.setText(buttonText);
mTurnOffButton.requestFocus(); if (mButtonTriggered) {
mButtonTriggered = false;
mTurnOffButton.requestFocus();
}
} else { } else {
mTurnOnButton.setVisibility(View.VISIBLE); mTurnOnButton.setVisibility(View.VISIBLE);
mTurnOffButton.setVisibility(View.GONE); mTurnOffButton.setVisibility(View.GONE);
mTurnOnButton.setText(buttonText); mTurnOnButton.setText(buttonText);
mTurnOnButton.requestFocus(); if (mButtonTriggered) {
mButtonTriggered = false;
mTurnOnButton.requestFocus();
}
} }
} }
} }

View File

@@ -39,6 +39,9 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference
private static final String TAG = "EnableZenModeButton"; private static final String TAG = "EnableZenModeButton";
private final FragmentManager mFragment; 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 mZenButtonOn;
private Button mZenButtonOff; private Button mZenButtonOff;
@@ -65,7 +68,6 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference
if (null == mZenButtonOn) { if (null == mZenButtonOn) {
mZenButtonOn = ((LayoutPreference) preference) mZenButtonOn = ((LayoutPreference) preference)
.findViewById(R.id.zen_mode_settings_turn_on_button); .findViewById(R.id.zen_mode_settings_turn_on_button);
mZenButtonOn.setFocusableInTouchMode(true);
updateZenButtonOnClickListener(preference); updateZenButtonOnClickListener(preference);
} }
@@ -73,6 +75,7 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference
mZenButtonOff = ((LayoutPreference) preference) mZenButtonOff = ((LayoutPreference) preference)
.findViewById(R.id.zen_mode_settings_turn_off_button); .findViewById(R.id.zen_mode_settings_turn_off_button);
mZenButtonOff.setOnClickListener(v -> { mZenButtonOff.setOnClickListener(v -> {
mButtonTriggered = true;
writeMetrics(preference, false); writeMetrics(preference, false);
mBackend.setZenMode(Settings.Global.ZEN_MODE_OFF); mBackend.setZenMode(Settings.Global.ZEN_MODE_OFF);
}); });
@@ -88,38 +91,39 @@ public class ZenModeButtonPreferenceController extends AbstractZenModePreference
case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS: case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS:
mZenButtonOff.setVisibility(View.VISIBLE); mZenButtonOff.setVisibility(View.VISIBLE);
mZenButtonOn.setVisibility(View.GONE); mZenButtonOn.setVisibility(View.GONE);
mZenButtonOff.requestFocus(); if (mButtonTriggered) {
mButtonTriggered = false;
mZenButtonOff.requestFocus();
}
break; break;
case Settings.Global.ZEN_MODE_OFF: case Settings.Global.ZEN_MODE_OFF:
default: default:
mZenButtonOff.setVisibility(View.GONE); mZenButtonOff.setVisibility(View.GONE);
updateZenButtonOnClickListener(preference); updateZenButtonOnClickListener(preference);
mZenButtonOn.setVisibility(View.VISIBLE); mZenButtonOn.setVisibility(View.VISIBLE);
mZenButtonOn.requestFocus(); if (mButtonTriggered) {
mButtonTriggered = false;
mZenButtonOn.requestFocus();
}
} }
} }
private void updateZenButtonOnClickListener(Preference preference) { private void updateZenButtonOnClickListener(Preference preference) {
int zenDuration = getZenDuration(); mZenButtonOn.setOnClickListener(v -> {
switch (zenDuration) { mButtonTriggered = true;
case Settings.Secure.ZEN_DURATION_PROMPT: writeMetrics(preference, true);
mZenButtonOn.setOnClickListener(v -> { int zenDuration = getZenDuration();
writeMetrics(preference, true); switch (zenDuration) {
case Settings.Secure.ZEN_DURATION_PROMPT:
new SettingsEnableZenModeDialog().show(mFragment, TAG); new SettingsEnableZenModeDialog().show(mFragment, TAG);
}); break;
break; case Settings.Secure.ZEN_DURATION_FOREVER:
case Settings.Secure.ZEN_DURATION_FOREVER:
mZenButtonOn.setOnClickListener(v -> {
writeMetrics(preference, true);
mBackend.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); mBackend.setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
}); break;
break; default:
default:
mZenButtonOn.setOnClickListener(v -> {
writeMetrics(preference, true);
mBackend.setZenModeForDuration(zenDuration); mBackend.setZenModeForDuration(zenDuration);
}); }
} });
} }
private void writeMetrics(Preference preference, boolean buttonOn) { private void writeMetrics(Preference preference, boolean buttonOn) {