diff options
4 files changed, 38 insertions, 53 deletions
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java index 6f687fe5f14c..f2c2af511f81 100644 --- a/core/java/android/widget/CompoundButton.java +++ b/core/java/android/widget/CompoundButton.java @@ -34,6 +34,7 @@ import android.view.ViewDebug; import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.autofill.AutoFillManager; import android.view.autofill.AutoFillType; import android.view.autofill.AutoFillValue; @@ -164,6 +165,10 @@ public abstract class CompoundButton extends Button implements Checkable { if (mOnCheckedChangeWidgetListener != null) { mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); } + final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class); + if (afm != null) { + afm.valueChanged(this); + } mBroadcasting = false; } @@ -563,8 +568,6 @@ public abstract class CompoundButton extends Button implements Checkable { // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable) - // TODO(b/33197203): override onProvideAutoFillStructure and add a change listener - @Override public void autoFill(AutoFillValue value) { if (!isEnabled()) return; @@ -579,6 +582,6 @@ public abstract class CompoundButton extends Button implements Checkable { @Override public AutoFillValue getAutoFillValue() { - return isEnabled() ? null : AutoFillValue.forToggle(isChecked()); + return isEnabled() ? AutoFillValue.forToggle(isChecked()) : null; } } diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java index 8ba4694c331c..76b38131477d 100644 --- a/core/java/android/widget/RadioGroup.java +++ b/core/java/android/widget/RadioGroup.java @@ -24,6 +24,7 @@ import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.view.autofill.AutoFillManager; import android.view.autofill.AutoFillType; import android.view.autofill.AutoFillValue; @@ -177,6 +178,10 @@ public class RadioGroup extends LinearLayout { if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId); } + final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class); + if (afm != null) { + afm.valueChanged(this); + } } private void setCheckedStateForView(int viewId, boolean checked) { @@ -405,8 +410,6 @@ public class RadioGroup extends LinearLayout { // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable) - // TODO(b/33197203): override onProvideAutoFillStructure and add a change listener - @Override public void autoFill(AutoFillValue value) { if (!isEnabled()) return; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index ab29257b4186..9e911632910e 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -726,9 +726,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // mAutoSizeStepGranularityInPx. private boolean mHasPresetAutoSizeValues = false; - // Watcher used to notify changes to auto-fill manager. - private AutoFillChangeWatcher mAutoFillChangeWatcher; - // Indicates whether the text was set from resources or dynamically, so it can be used to // sanitize auto-fill request. private boolean mTextFromResource = false; @@ -9112,6 +9109,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener list.get(i).afterTextChanged(text); } } + + // Always notify AutoFillManager - it will return right away if auto-fill is disabled. + final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class); + if (afm != null) { + if (DEBUG_AUTOFILL) { + Log.v(LOG_TAG, "sendAfterTextChanged(): notify AFM for text=" + text); + } + afm.valueChanged(TextView.this); + } + hideErrorIfUnchanged(); } @@ -9876,11 +9883,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener || isPasswordInputType(getInputType()); if (forAutoFill) { structure.setSanitized(mTextFromResource); - if (mAutoFillChangeWatcher == null && isTextEditable()) { - mAutoFillChangeWatcher = new AutoFillChangeWatcher(); - addTextChangedListener(mAutoFillChangeWatcher); - // TODO(b/33197203): remove mAutoFillValueListener auto-fill session is finished - } } if (!isPassword || forAutoFill) { @@ -11507,30 +11509,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - // TODO(b/33197203): implements SpanWatcher too? - private final class AutoFillChangeWatcher implements TextWatcher { - - private final AutoFillManager mAfm = mContext.getSystemService(AutoFillManager.class); - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - if (mAfm != null) { - if (DEBUG_AUTOFILL) { - Log.v(LOG_TAG, "AutoFillChangeWatcher.afterTextChanged(): s=" + s); - } - mAfm.valueChanged(TextView.this); - } - } - } - private class ChangeWatcher implements TextWatcher, SpanWatcher { private CharSequence mBeforeText; diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java index 081acf5a94d9..55e00ed6eea3 100644 --- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java @@ -792,25 +792,26 @@ final class AutoFillManagerServiceImpl { return; } - if ((flags & FLAG_VALUE_CHANGED) != 0 && value != null && - !value.equals(viewState.mAutoFillValue)) { - viewState.mValueUpdated = true; - - // Must check if this update was caused by auto-filling the view, in which - // case we just update the value, but not the UI. - if (mAutoFilledDataset != null) { - final AutoFillValue filledValue = findValue(mAutoFilledDataset, id); - if (value.equals(filledValue)) { - viewState.mAutoFillValue = value; - return; + if ((flags & FLAG_VALUE_CHANGED) != 0) { + if (value != null && !value.equals(viewState.mAutoFillValue)) { + viewState.mValueUpdated = true; + + // Must check if this update was caused by auto-filling the view, in which + // case we just update the value, but not the UI. + if (mAutoFilledDataset != null) { + final AutoFillValue filledValue = findValue(mAutoFilledDataset, id); + if (value.equals(filledValue)) { + viewState.mAutoFillValue = value; + return; + } } - } - // Change value - viewState.mAutoFillValue = value; + // Change value + viewState.mAutoFillValue = value; - // Update the chooser UI - mUi.updateFillUi(value.coerceToString()); + // Update the chooser UI + mUi.updateFillUi(value.coerceToString()); + } return; } |