Fix checkbox in magnification mode dialog does not have ripple effect

* Move onClickListener to LinearLayout since checkbox has null background in xml
* Rewrite setTextAreasClickListener logic to fit the need: at least one
checkbox need to be checked, and to let talkback announce disabled when
view is really in disabled state.

Bug: 164343865
Test: manual test
Change-Id: Ia5a831febc41f01858908cbdc365cf9a6a1282e3
This commit is contained in:
jasonwshsu
2020-08-14 18:17:53 +08:00
parent c2dd8ff32a
commit 62dc1b6364

View File

@@ -23,6 +23,7 @@ import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox; import android.widget.CheckBox;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
@@ -149,13 +150,33 @@ public class MagnificationSettingsFragment extends DashboardFragment {
private void initializeDialogCheckBox(AlertDialog dialog) { private void initializeDialogCheckBox(AlertDialog dialog) {
final View dialogFullScreenView = dialog.findViewById(R.id.magnify_full_screen); final View dialogFullScreenView = dialog.findViewById(R.id.magnify_full_screen);
final View dialogFullScreenTextArea = dialogFullScreenView.findViewById(R.id.container);
mMagnifyFullScreenCheckBox = dialogFullScreenView.findViewById(R.id.checkbox); mMagnifyFullScreenCheckBox = dialogFullScreenView.findViewById(R.id.checkbox);
final View dialogWidowView = dialog.findViewById(R.id.magnify_window_screen); final View dialogWidowView = dialog.findViewById(R.id.magnify_window_screen);
final View dialogWindowTextArea = dialogWidowView.findViewById(R.id.container);
mMagnifyWindowCheckBox = dialogWidowView.findViewById(R.id.checkbox); mMagnifyWindowCheckBox = dialogWidowView.findViewById(R.id.checkbox);
setTextAreasClickListener(dialogFullScreenTextArea, mMagnifyFullScreenCheckBox,
dialogWindowTextArea, mMagnifyWindowCheckBox);
updateAlertDialogCheckState(); updateAlertDialogCheckState();
updateAlertDialogEnableState(); updateAlertDialogEnableState(dialogFullScreenTextArea, dialogWindowTextArea);
}
private void setTextAreasClickListener(View fullScreenTextArea, CheckBox fullScreenCheckBox,
View windowTextArea, CheckBox windowCheckBox) {
fullScreenTextArea.setOnClickListener(v -> {
fullScreenCheckBox.toggle();
updateCapabilities(false);
updateAlertDialogEnableState(fullScreenTextArea, windowTextArea);
});
windowTextArea.setOnClickListener(v -> {
windowCheckBox.toggle();
updateCapabilities(false);
updateAlertDialogEnableState(fullScreenTextArea, windowTextArea);
});
} }
private void updateAlertDialogCheckState() { private void updateAlertDialogCheckState() {
@@ -168,30 +189,34 @@ public class MagnificationSettingsFragment extends DashboardFragment {
private void updateCheckStatus(CheckBox checkBox, int mode) { private void updateCheckStatus(CheckBox checkBox, int mode) {
checkBox.setChecked((mode & mCapabilities) != 0); checkBox.setChecked((mode & mCapabilities) != 0);
checkBox.setOnClickListener(v -> {
updateCapabilities(false);
updateAlertDialogEnableState();
});
} }
private void updateAlertDialogEnableState() { private void updateAlertDialogEnableState(View fullScreenTextArea, View windowTextArea) {
if (mCapabilities != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) { switch (mCapabilities) {
disableEnabledMagnificationModePreference(); case Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN:
} else { setViewAndChildrenEnabled(fullScreenTextArea, false);
enableAllPreference(); break;
case Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW:
setViewAndChildrenEnabled(windowTextArea, false);
break;
case Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL:
setViewAndChildrenEnabled(fullScreenTextArea, true);
setViewAndChildrenEnabled(windowTextArea, true);
break;
default:
throw new IllegalArgumentException(
"Unsupported ACCESSIBILITY_MAGNIFICATION_CAPABILITY " + mCapabilities);
} }
} }
private void enableAllPreference() { private void setViewAndChildrenEnabled(View view, boolean enabled) {
mMagnifyFullScreenCheckBox.setEnabled(true); view.setEnabled(enabled);
mMagnifyWindowCheckBox.setEnabled(true); if (view instanceof ViewGroup) {
final ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
setViewAndChildrenEnabled(child, enabled);
} }
private void disableEnabledMagnificationModePreference() {
if (!mMagnifyFullScreenCheckBox.isChecked()) {
mMagnifyWindowCheckBox.setEnabled(false);
} else if (!mMagnifyWindowCheckBox.isChecked()) {
mMagnifyFullScreenCheckBox.setEnabled(false);
} }
} }