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

Commit 0200d9ea authored by Felipe Leme's avatar Felipe Leme
Browse files

Improved AutoFill Save workflow.

Currently, the onProvideAutoFillStructure() methods can be called
twice: to auto-fill an activity and to save the activity's data
in the service.

The problem with this approach is that when the save workflow is
called, the activity might have been gone. Hence, a proper approach
is to keep the initial AssistStructure data in the system_service
memory, watch for view changes, and then passed the new structure
back to the AutoFillService.

A side effect of this change is that we need another way to determine
if the view is sanitized or not. For "standard" views, that will be
defined based on whether the view content come from a resource or not,
but that logic is not implemented yet (for now, all views will be
considered sanitized, except for TextView passwords). For "custom"
views (such as WebView), this logic is responsibility of the view
implementation, through the newChild() method, which now takes a
flag (whose value could be AUTO_FILL_FLAG_SANITIZED for sanitized
views).

The SaveCallback.onSuccess() method was simplified: it does
not need a list of saved ids anymore the auto-fill UI will not use it
anymore.

Another side effect is that the Save notification is gone - until
it's attached again, it can be test by using:

    adb shell cmd autofill save

Finally, hook AutoFillUI on ACTION_CLOSE_SYSTEM_DIALOGS events.

BUG: 33269702
BUG: 31001899
Test: manual verification
Test: CtsAutoFillServiceTestCases passes
Change-Id: I907a7e21d1b3cd1ab6dec3a08d144a52655da46f
parent 4dfc39cc
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -6508,6 +6508,7 @@ package android.app.assist {
    method public float getAlpha();
    method public android.view.autofill.AutoFillId getAutoFillId();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.view.autofill.AutoFillValue getAutoFillValue();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -35872,7 +35873,7 @@ package android.service.autofill {
  public final class SaveCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.AutoFillId[]);
    method public void onSuccess();
  }
}
@@ -44572,8 +44573,6 @@ 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 AUTO_FILL_FLAG_TYPE_FILL = 268435456; // 0x10000000
    field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 536870912; // 0x20000000
    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
@@ -45209,7 +45208,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 android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -45218,11 +45217,12 @@ 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 android.view.ViewStructure newChild(int, 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 setAutoFillValue(android.view.autofill.AutoFillValue);
    method public abstract void setCheckable(boolean);
    method public abstract void setChecked(boolean);
    method public abstract void setChildCount(int);
@@ -45245,6 +45245,7 @@ package android.view {
    method public abstract void setTextStyle(float, int, int, int);
    method public abstract void setTransformation(android.graphics.Matrix);
    method public abstract void setVisibility(int);
    field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
  }
  public final class ViewStub extends android.view.View {
@@ -46467,6 +46468,7 @@ package android.view.autofill {
  }
  public final class AutoFillManager {
    method public void onValueChanged(android.view.View, android.view.autofill.AutoFillValue);
    method public void updateAutoFillInput(android.view.View, int);
    method public void updateAutoFillInput(android.view.View, int, android.graphics.Rect, int);
    field public static final int FLAG_UPDATE_UI_HIDE = 2; // 0x2
+7 −5
Original line number Diff line number Diff line
@@ -6741,6 +6741,7 @@ package android.app.assist {
    method public float getAlpha();
    method public android.view.autofill.AutoFillId getAutoFillId();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.view.autofill.AutoFillValue getAutoFillValue();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -38901,7 +38902,7 @@ package android.service.autofill {
  public final class SaveCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.AutoFillId[]);
    method public void onSuccess();
  }
}
@@ -47976,8 +47977,6 @@ 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 AUTO_FILL_FLAG_TYPE_FILL = 268435456; // 0x10000000
    field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 536870912; // 0x20000000
    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
@@ -48613,7 +48612,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 android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -48622,11 +48621,12 @@ 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 android.view.ViewStructure newChild(int, 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 setAutoFillValue(android.view.autofill.AutoFillValue);
    method public abstract void setCheckable(boolean);
    method public abstract void setChecked(boolean);
    method public abstract void setChildCount(int);
@@ -48649,6 +48649,7 @@ package android.view {
    method public abstract void setTextStyle(float, int, int, int);
    method public abstract void setTransformation(android.graphics.Matrix);
    method public abstract void setVisibility(int);
    field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
  }
  public final class ViewStub extends android.view.View {
@@ -49874,6 +49875,7 @@ package android.view.autofill {
  }
  public final class AutoFillManager {
    method public void onValueChanged(android.view.View, android.view.autofill.AutoFillValue);
    method public void updateAutoFillInput(android.view.View, int);
    method public void updateAutoFillInput(android.view.View, int, android.graphics.Rect, int);
    field public static final int FLAG_UPDATE_UI_HIDE = 2; // 0x2
+7 −5
Original line number Diff line number Diff line
@@ -6531,6 +6531,7 @@ package android.app.assist {
    method public float getAlpha();
    method public android.view.autofill.AutoFillId getAutoFillId();
    method public android.view.autofill.AutoFillType getAutoFillType();
    method public android.view.autofill.AutoFillValue getAutoFillValue();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -36007,7 +36008,7 @@ package android.service.autofill {
  public final class SaveCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.AutoFillId[]);
    method public void onSuccess();
  }
}
@@ -44879,8 +44880,6 @@ 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 AUTO_FILL_FLAG_TYPE_FILL = 268435456; // 0x10000000
    field public static final int AUTO_FILL_FLAG_TYPE_SAVE = 536870912; // 0x20000000
    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
@@ -45520,7 +45519,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 android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -45529,11 +45528,12 @@ 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 android.view.ViewStructure newChild(int, 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 setAutoFillValue(android.view.autofill.AutoFillValue);
    method public abstract void setCheckable(boolean);
    method public abstract void setChecked(boolean);
    method public abstract void setChildCount(int);
@@ -45556,6 +45556,7 @@ package android.view {
    method public abstract void setTextStyle(float, int, int, int);
    method public abstract void setTransformation(android.graphics.Matrix);
    method public abstract void setVisibility(int);
    field public static final int AUTO_FILL_FLAG_SANITIZED = 1; // 0x1
  }
  public final class ViewStub extends android.view.View {
@@ -46780,6 +46781,7 @@ package android.view.autofill {
  }
  public final class AutoFillManager {
    method public void onValueChanged(android.view.View, android.view.autofill.AutoFillValue);
    method public void updateAutoFillInput(android.view.View, int);
    method public void updateAutoFillInput(android.view.View, int, android.graphics.Rect, int);
    field public static final int FLAG_UPDATE_UI_HIDE = 2; // 0x2
+0 −3
Original line number Diff line number Diff line
@@ -505,9 +505,6 @@ public class ActivityManager {
    /** @hide requestType for assist context: generate full AssistStructure for auto-fill. */
    public static final int ASSIST_CONTEXT_AUTO_FILL = 2;

    /** @hide requestType for assist context: generate full AssistStructure for auto-fill save. */
    public static final int ASSIST_CONTEXT_AUTO_FILL_SAVE = 3;

    /** @hide Flag for registerUidObserver: report changes in process state. */
    public static final int UID_OBSERVER_PROCSTATE = 1<<0;

+4 −11
Original line number Diff line number Diff line
@@ -91,7 +91,6 @@ import android.security.NetworkSecurityPolicy;
import android.security.net.config.NetworkSecurityConfigProvider;
import android.service.autofill.AutoFillService;
import android.service.autofill.IAutoFillAppCallback;
import android.service.voice.VoiceInteractionSession;
import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
@@ -641,7 +640,6 @@ public final class ActivityThread {
        IBinder requestToken;
        int requestType;
        int sessionId;
        int flags;
    }

    static final class ActivityConfigChangeData {
@@ -1249,13 +1247,12 @@ public final class ActivityThread {

        @Override
        public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken,
                int requestType, int sessionId, int flags) {
                int requestType, int sessionId) {
            RequestAssistContextExtras cmd = new RequestAssistContextExtras();
            cmd.activityToken = activityToken;
            cmd.requestToken = requestToken;
            cmd.requestType = requestType;
            cmd.sessionId = sessionId;
            cmd.flags = flags;
            sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd);
        }

@@ -2905,9 +2902,7 @@ public final class ActivityThread {
        // - it does not need an AssistContent
        // - it does not call onProvideAssistData()
        // - it needs an IAutoFillCallback
        // - it sets the flags so views can provide autofill-specific data (such as passwords)
        boolean forAutoFill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL
                || cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL_SAVE;
        boolean forAutoFill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL;

        // TODO(b/33197203): decide if lastSessionId logic applies to auto-fill sessions
        if (mLastSessionId != cmd.sessionId) {
@@ -2934,11 +2929,8 @@ public final class ActivityThread {
                referrer = r.activity.onProvideReferrer();
            }
            if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutoFill) {
                structure = new AssistStructure(r.activity, cmd.flags);
                structure = new AssistStructure(r.activity, forAutoFill);
                Intent activityIntent = r.activity.getIntent();
                if (forAutoFill) {
                    data.putInt(VoiceInteractionSession.KEY_FLAGS, cmd.flags);
                }
                boolean addAutoFillCallback = false;
                // TODO(b/33197203): re-evaluate conditions below for auto-fill. In particular,
                // FLAG_SECURE might be allowed on AUTO_FILL but not on AUTO_FILL_SAVE)
@@ -2979,6 +2971,7 @@ public final class ActivityThread {
        if (structure == null) {
            structure = new AssistStructure();
        }

        // TODO(b/33197203): decide if lastSessionId logic applies to auto-fill sessions
        mLastAssistStructures.add(new WeakReference<>(structure));
        IActivityManager mgr = ActivityManager.getService();
Loading