Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d553874 authored by Felipe Leme's avatar Felipe Leme
Browse files

YAMAFFR - Yet Another Major AutoFill Framework Refactoring

- Explicitly split View methods into Assist and AutoFill methods, rather
  than use an overloaded method that takes flags.
- Simarly, renamed ASSIST_FLAG_SANITIZED_TEXT and
  ASSIST_FLAG_NON_SANITIZED_TEXT flags to
  AUTO_FILL_FLAG_TYPE_FILL and AUTO_FILL_FLAG_TYPE_SAVE respectively.
- Created a AutoFillUI class to host the auto-fill bar and other UI
  affordances.
- Moved the temporary notifications to AutoFillUI (eventually that
  class will host the real UI).
- Moved FillData to android.app.view.autofill package.
- Split IAutoFillCallback in 2 (IAutoFillAppCallback and
  IAutoFillServerCallback, residing at the app and system_server
  respectively), so service cannot fill the app directly (which lets
  the framework control the UI).
- Moved assist's IResultReceiver to AutoFillServiceImpl so
  system_server can act as a mediator between the AutoFillService
  implementation and the app being auto-filled.
- Replaced FillData and FillableInputFields by a bunch of new objects:
  - FillResponse contains a group of Datasets, each representing
  different values
    that can be used to auto-fill an activity (for example, different
    user accounts), optional id of fields the service is interested
    to save, and an optional bundle for service-side extras.
  - Dataset contains a name, Fields, and an optional bundle for
    service-side extras.
  - Fields contain an AutoFillId (parcelable) and a value (Bundle)
- Changed the temporary notifications to emulate the new workflow:
  - Initial notification requests the auto-fill data but do not
    auto-fill.
  - Once service calls back, a new notification is shown with the
    results.
  - Then if the user selects a dataset, the activity is auto-filled
    with it.
  - It also shows a notification to emulate what can be saved.
- Created an VirtualViewDelegate for views that uses a virtual
  hierarchy for assist data.
- Added new methods on ViewStructure to add children with virtual ids.
- Added 2 methods on View to support auto-fill:
  - autoFill(Bundle) to auto-fill the view.
  - getAutoFillType() to return how the view can be auto-filled.
- AutoFillType defines the input fields that support auto-fill:
  - Text fields (like EditText)
  - Toggle fields (like CheckBox)
  - Lists (like RadioGroup)
- AutoFillType can also have a sub-type representing its semantic (for
  now only text fields have it, and it's the same as getInputType()).
- etc :-)

Bug: 31001899
Test: manual verification
Change-Id: I2dd2fdedcb3ecd1e4403f9c32fa644cb914e186f
parent e961992e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -262,8 +262,9 @@ LOCAL_SRC_FILES += \
	core/java/android/os/storage/IObbActionListener.aidl \
	core/java/android/security/IKeystoreService.aidl \
	core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl \
	core/java/android/service/autofill/IAutoFillCallback.aidl \
	core/java/android/service/autofill/IAutoFillAppCallback.aidl \
	core/java/android/service/autofill/IAutoFillManagerService.aidl \
	core/java/android/service/autofill/IAutoFillServerCallback.aidl \
	core/java/android/service/autofill/IAutoFillService.aidl \
	core/java/android/service/carrier/ICarrierService.aidl \
	core/java/android/service/carrier/ICarrierMessagingCallback.aidl \
+94 −20
Original line number Diff line number Diff line
@@ -6368,7 +6368,8 @@ package android.app.assist {
  public static class AssistStructure.ViewNode {
    method public float getAlpha();
    method public int getAutoFillId();
    method public android.view.autofill.AutoFillId getAutoFillId();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -35042,26 +35043,19 @@ package android.service.autofill {
    method public void onDisconnected();
    method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
    method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.SaveCallback);
    field public static final java.lang.String EXTRA_DATASET_EXTRAS = "android.service.autofill.extra.DATASET_EXTRAS";
    field public static final java.lang.String EXTRA_RESPONSE_EXTRAS = "android.service.autofill.extra.RESPONSE_EXTRAS";
    field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
  }
  public final class FillCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.service.autofill.FillCallback.FillData);
  }
  public static final class FillCallback.FillData {
  }
  public static class FillCallback.FillData.Builder {
    ctor public FillCallback.FillData.Builder();
    method public android.service.autofill.FillCallback.FillData build();
    method public android.service.autofill.FillCallback.FillData.Builder setTextField(int, java.lang.String);
    method public void onSuccess(android.view.autofill.FillResponse);
  }
  public final class SaveCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(int[]);
    method public void onSuccess(android.view.autofill.AutoFillId[]);
  }
}
@@ -43147,6 +43141,7 @@ package android.view {
    method public void addTouchables(java.util.ArrayList<android.view.View>);
    method public android.view.ViewPropertyAnimator animate();
    method public void announceForAccessibility(java.lang.CharSequence);
    method public void autoFill(android.view.autofill.AutoFillValue);
    method protected boolean awakenScrollBars();
    method protected boolean awakenScrollBars(int);
    method protected boolean awakenScrollBars(int, boolean);
@@ -43198,8 +43193,8 @@ package android.view {
    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
    method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public deprecated void dispatchProvideStructure(android.view.ViewStructure);
    method public void dispatchProvideStructure(android.view.ViewStructure, int);
    method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
    method public void dispatchProvideStructure(android.view.ViewStructure);
    method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSetActivated(boolean);
@@ -43234,6 +43229,8 @@ package android.view {
    method public float getAlpha();
    method public android.view.animation.Animation getAnimation();
    method public android.os.IBinder getApplicationWindowToken();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.view.autofill.VirtualViewDelegate getAutoFillVirtualViewDelegate(android.view.autofill.VirtualViewDelegate.Callback);
    method public android.graphics.drawable.Drawable getBackground();
    method public android.content.res.ColorStateList getBackgroundTintList();
    method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -43470,10 +43467,10 @@ package android.view {
    method protected void onMeasure(int, int);
    method protected void onOverScrolled(int, int, boolean, boolean);
    method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public deprecated void onProvideStructure(android.view.ViewStructure);
    method public void onProvideStructure(android.view.ViewStructure, int);
    method public deprecated void onProvideVirtualStructure(android.view.ViewStructure);
    method public void onProvideVirtualStructure(android.view.ViewStructure, int);
    method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
    method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
    method public void onProvideStructure(android.view.ViewStructure);
    method public void onProvideVirtualStructure(android.view.ViewStructure);
    method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    method protected void onRestoreInstanceState(android.os.Parcelable);
    method public void onRtlPropertiesChanged(int);
@@ -43680,8 +43677,8 @@ package android.view {
    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
    field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
    field public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 2; // 0x2
    field public static final int ASSIST_FLAG_SANITIZED_TEXT = 1; // 0x1
    field public static final int AUTO_FILL_FLAG_TYPE_FILL = 1; // 0x1
    field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 2; // 0x2
    field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
    field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
    field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -44311,6 +44308,7 @@ package android.view {
    method public abstract int addChildCount(int);
    method public abstract void asyncCommit();
    method public abstract android.view.ViewStructure asyncNewChild(int);
    method public abstract android.view.ViewStructure asyncNewChild(int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -44319,9 +44317,11 @@ package android.view {
    method public abstract int getTextSelectionStart();
    method public abstract boolean hasExtras();
    method public abstract android.view.ViewStructure newChild(int);
    method public abstract android.view.ViewStructure newChild(int, int);
    method public abstract void setAccessibilityFocused(boolean);
    method public abstract void setActivated(boolean);
    method public abstract void setAlpha(float);
    method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
    method public abstract void setCheckable(boolean);
    method public abstract void setChecked(boolean);
    method public abstract void setChildCount(int);
@@ -45542,6 +45542,80 @@ package android.view.animation {
}
package android.view.autofill {
  public final class AutoFillId implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
  }
  public final class AutoFillType implements android.os.Parcelable {
    method public int describeContents();
    method public static android.view.autofill.AutoFillType forList();
    method public static android.view.autofill.AutoFillType forText(int);
    method public static android.view.autofill.AutoFillType forToggle();
    method public int getSubType();
    method public boolean isList();
    method public boolean isText();
    method public boolean isToggle();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
  }
  public final class AutoFillValue implements android.os.Parcelable {
    method public int describeContents();
    method public static android.view.autofill.AutoFillValue forList(int);
    method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
    method public static android.view.autofill.AutoFillValue forToggle(boolean);
    method public int getListValue();
    method public java.lang.CharSequence getTextValue();
    method public boolean getToggleValue();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
  }
  public final class Dataset implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.Dataset> CREATOR;
  }
  public static final class Dataset.Builder {
    ctor public Dataset.Builder(java.lang.CharSequence);
    method public android.view.autofill.Dataset build();
    method public android.view.autofill.Dataset.Builder setExtras(android.os.Bundle);
    method public android.view.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
  }
  public final class FillResponse implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.FillResponse> CREATOR;
  }
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method public android.view.autofill.FillResponse.Builder addDataset(android.view.autofill.Dataset);
    method public android.view.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
    method public android.view.autofill.FillResponse build();
    method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
  public abstract class VirtualViewDelegate {
    ctor public VirtualViewDelegate();
    method public abstract void autoFill(int, android.view.autofill.AutoFillValue);
  }
  public static abstract class VirtualViewDelegate.Callback {
    ctor public VirtualViewDelegate.Callback();
    method public void onFocusChanged(int, boolean);
    method public void onNodeRemoved(int...);
    method public void onValueChanged(int);
  }
}
package android.view.inputmethod {
  public class BaseInputConnection implements android.view.inputmethod.InputConnection {
+95 −21
Original line number Diff line number Diff line
@@ -6571,7 +6571,8 @@ package android.app.assist {
  public static class AssistStructure.ViewNode {
    method public float getAlpha();
    method public int getAutoFillId();
    method public android.view.autofill.AutoFillId getAutoFillId();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -37905,26 +37906,19 @@ package android.service.autofill {
    method public void onDisconnected();
    method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
    method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.SaveCallback);
    field public static final java.lang.String EXTRA_DATASET_EXTRAS = "android.service.autofill.extra.DATASET_EXTRAS";
    field public static final java.lang.String EXTRA_RESPONSE_EXTRAS = "android.service.autofill.extra.RESPONSE_EXTRAS";
    field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
  }
  public final class FillCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.service.autofill.FillCallback.FillData);
  }
  public static final class FillCallback.FillData {
  }
  public static class FillCallback.FillData.Builder {
    ctor public FillCallback.FillData.Builder();
    method public android.service.autofill.FillCallback.FillData build();
    method public android.service.autofill.FillCallback.FillData.Builder setTextField(int, java.lang.String);
    method public void onSuccess(android.view.autofill.FillResponse);
  }
  public final class SaveCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(int[]);
    method public void onSuccess(android.view.autofill.AutoFillId[]);
  }
}
@@ -46365,6 +46359,7 @@ package android.view {
    method public void addTouchables(java.util.ArrayList<android.view.View>);
    method public android.view.ViewPropertyAnimator animate();
    method public void announceForAccessibility(java.lang.CharSequence);
    method public void autoFill(android.view.autofill.AutoFillValue);
    method protected boolean awakenScrollBars();
    method protected boolean awakenScrollBars(int);
    method protected boolean awakenScrollBars(int, boolean);
@@ -46416,8 +46411,8 @@ package android.view {
    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
    method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public deprecated void dispatchProvideStructure(android.view.ViewStructure);
    method public void dispatchProvideStructure(android.view.ViewStructure, int);
    method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
    method public void dispatchProvideStructure(android.view.ViewStructure);
    method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSetActivated(boolean);
@@ -46452,6 +46447,8 @@ package android.view {
    method public float getAlpha();
    method public android.view.animation.Animation getAnimation();
    method public android.os.IBinder getApplicationWindowToken();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.view.autofill.VirtualViewDelegate getAutoFillVirtualViewDelegate(android.view.autofill.VirtualViewDelegate.Callback);
    method public android.graphics.drawable.Drawable getBackground();
    method public android.content.res.ColorStateList getBackgroundTintList();
    method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -46688,10 +46685,10 @@ package android.view {
    method protected void onMeasure(int, int);
    method protected void onOverScrolled(int, int, boolean, boolean);
    method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public deprecated void onProvideStructure(android.view.ViewStructure);
    method public void onProvideStructure(android.view.ViewStructure, int);
    method public deprecated void onProvideVirtualStructure(android.view.ViewStructure);
    method public void onProvideVirtualStructure(android.view.ViewStructure, int);
    method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
    method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
    method public void onProvideStructure(android.view.ViewStructure);
    method public void onProvideVirtualStructure(android.view.ViewStructure);
    method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    method protected void onRestoreInstanceState(android.os.Parcelable);
    method public void onRtlPropertiesChanged(int);
@@ -46898,8 +46895,8 @@ package android.view {
    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
    field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
    field public static final int ASSIST_FLAG_NON_SANITIZED_TEXT = 2; // 0x2
    field public static final int ASSIST_FLAG_SANITIZED_TEXT = 1; // 0x1
    field public static final int AUTO_FILL_FLAG_TYPE_FILL = 1; // 0x1
    field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 2; // 0x2
    field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
    field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
    field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -47529,6 +47526,7 @@ package android.view {
    method public abstract int addChildCount(int);
    method public abstract void asyncCommit();
    method public abstract android.view.ViewStructure asyncNewChild(int);
    method public abstract android.view.ViewStructure asyncNewChild(int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -47537,9 +47535,11 @@ package android.view {
    method public abstract int getTextSelectionStart();
    method public abstract boolean hasExtras();
    method public abstract android.view.ViewStructure newChild(int);
    method public abstract android.view.ViewStructure newChild(int, int);
    method public abstract void setAccessibilityFocused(boolean);
    method public abstract void setActivated(boolean);
    method public abstract void setAlpha(float);
    method public abstract void setAutoFillType(android.view.autofill.AutoFillType);
    method public abstract void setCheckable(boolean);
    method public abstract void setChecked(boolean);
    method public abstract void setChildCount(int);
@@ -48763,6 +48763,80 @@ package android.view.animation {
}
package android.view.autofill {
  public final class AutoFillId implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
  }
  public final class AutoFillType implements android.os.Parcelable {
    method public int describeContents();
    method public static android.view.autofill.AutoFillType forList();
    method public static android.view.autofill.AutoFillType forText(int);
    method public static android.view.autofill.AutoFillType forToggle();
    method public int getSubType();
    method public boolean isList();
    method public boolean isText();
    method public boolean isToggle();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
  }
  public final class AutoFillValue implements android.os.Parcelable {
    method public int describeContents();
    method public static android.view.autofill.AutoFillValue forList(int);
    method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
    method public static android.view.autofill.AutoFillValue forToggle(boolean);
    method public int getListValue();
    method public java.lang.CharSequence getTextValue();
    method public boolean getToggleValue();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
  }
  public final class Dataset implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.Dataset> CREATOR;
  }
  public static final class Dataset.Builder {
    ctor public Dataset.Builder(java.lang.CharSequence);
    method public android.view.autofill.Dataset build();
    method public android.view.autofill.Dataset.Builder setExtras(android.os.Bundle);
    method public android.view.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
  }
  public final class FillResponse implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.autofill.FillResponse> CREATOR;
  }
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method public android.view.autofill.FillResponse.Builder addDataset(android.view.autofill.Dataset);
    method public android.view.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
    method public android.view.autofill.FillResponse build();
    method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
  public abstract class VirtualViewDelegate {
    ctor public VirtualViewDelegate();
    method public abstract void autoFill(int, android.view.autofill.AutoFillValue);
  }
  public static abstract class VirtualViewDelegate.Callback {
    ctor public VirtualViewDelegate.Callback();
    method public void onFocusChanged(int, boolean);
    method public void onNodeRemoved(int...);
    method public void onValueChanged(int);
  }
}
package android.view.inputmethod {
  public class BaseInputConnection implements android.view.inputmethod.InputConnection {
@@ -50278,8 +50352,8 @@ package android.webkit {
    method public abstract boolean onKeyUp(int, android.view.KeyEvent);
    method public abstract void onMeasure(int, int);
    method public abstract void onOverScrolled(int, int, boolean, boolean);
    method public default void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
    method public abstract void onProvideVirtualStructure(android.view.ViewStructure);
    method public default void onProvideVirtualStructure(android.view.ViewStructure, int);
    method public abstract void onScrollChanged(int, int, int, int);
    method public abstract void onSizeChanged(int, int, int, int);
    method public abstract void onStartTemporaryDetach();
+94 −20

File changed.

Preview size limit exceeded, changes collapsed.

+66 −29

File changed.

Preview size limit exceeded, changes collapsed.

Loading