Don't trigger auto-fill request if mode is manual

Also improve descriptions of the attributes, constants and methods.

Test: Ran updated ViewAttributesTest
Bug: 34077687
Change-Id: I532f1b26b97ba113f316eed6fc68dae2ed33ea6a
This commit is contained in:
Philip P. Moltmann
2017-02-17 16:38:11 -08:00
parent 1e14b5bb6a
commit 576a847e03
3 changed files with 53 additions and 5 deletions

View File

@@ -953,7 +953,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public @interface AutoFillMode {}
/**
* This view inherits the autofill state from it's parent. If there is no parent it is
* This view inherits the auto-fill state from it's parent. If there is no parent it is
* {@link #AUTO_FILL_MODE_AUTO}.
* Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
* {@code android:autoFillMode}.
@@ -968,7 +968,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public static final int AUTO_FILL_MODE_AUTO = 1;
/**
* Require the user to manually force an auto-fill request.
* Do not trigger an auto-fill request if this view is focused. The user can still force
* an auto-fill request.
* <p>This does not prevent this field from being auto-filled if an auto-fill operation is
* triggered from a different view.</p>
*
* Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">{@code
* android:autoFillMode}.
*/
@@ -6523,7 +6527,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (isAutoFillable()) {
AutoFillManager afm = getAutoFillManager();
if (afm != null) {
afm.focusChanged(this, gainFocus);
boolean adjGainFocus = gainFocus;
if (adjGainFocus && getResolvedAutoFillMode() == AUTO_FILL_MODE_MANUAL) {
adjGainFocus = false;
}
afm.focusChanged(this, adjGainFocus);
}
}
@@ -9306,6 +9315,30 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
return (mPrivateFlags3 & PFLAG3_AUTO_FILL_MODE_MASK) >> PFLAG3_AUTO_FILL_MODE_SHIFT;
}
/**
* Returns the resolved auto-fill mode for this view.
*
* This is the same as {@link #getAutoFillMode()} but if the mode is
* {@link #AUTO_FILL_MODE_INHERIT} the parents auto-fill mode will be returned.
*
* @return One of {@link #AUTO_FILL_MODE_AUTO}, or {@link #AUTO_FILL_MODE_MANUAL}.
*
* @hide
*/
public @AutoFillMode int getResolvedAutoFillMode() {
@AutoFillMode int autoFillMode = getAutoFillMode();
if (autoFillMode == AUTO_FILL_MODE_INHERIT) {
if (mParent == null) {
throw new IllegalStateException("View is detached, cannot resolve autoFillMode");
} else {
return mParent.getResolvedAutoFillMode();
}
} else {
return autoFillMode;
}
}
/**
* Find the nearest view in the specified direction that can take focus.
* This does not actually give focus to that view.

View File

@@ -659,4 +659,17 @@ public interface ViewParent {
* @return true if the action was consumed by this ViewParent
*/
public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments);
/**
* Return the resolved auto-fill mode.
*
* @return The resolved auto-fill mode
*
* @see View#getResolvedAutoFillMode()
*
* @hide
*/
default @View.AutoFillMode int getResolvedAutoFillMode() {
return View.AUTO_FILL_MODE_AUTO;
}
}

View File

@@ -2289,12 +2289,14 @@
<!-- Controls the auto-fill behavior for this view -->
<attr name="autoFillMode">
<!-- Inherit the behavior from the parent. If there is no parent it is auto. -->
<!-- Inherit the behavior from the parent. If there is no parent it is auto. This is the
default value for this attribute.-->
<enum name="inherit" value="0" />
<!-- Allows this view to automatically trigger an auto-fill request when it get focus.
-->
<enum name="auto" value="1" />
<!-- The user has to manually force an auto-fill request for this view. -->
<!-- Do not trigger an auto-fill request when this view is focused. The user can still
manually force an auto-fill request for this view. -->
<enum name="manual" value="2" />
</attr>