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

Commit 29a5b0d0 authored by Felipe Leme's avatar Felipe Leme
Browse files

Added a callback for AutoFillService.

So far AutoFillService only received the assist data from framework; in
this CL, it also offers a method where the auto-fill provider can send
the auto-fill data back to framework.

The workflow is:

- AFMSI calls a new AM method (requestAutoFillData(), instead
  of requestAssistContextExtras()).
- The assist receiver is located in the app, not on system service.
- AM uses a new request type (ASSIST_CONTEXT_AUTOFILL) to request the
  assist data to the activity.
- ViewStructure has a new setAutoFillId() method which is used to set an
  unique id for the view.
- View uses the accessibility id to implement the auto-fill id.
- When the activity fullfills the request, it creates an IAutoFillCallback
  remote object - that will be used to set the auto-fill fields - and
  returns it in the assist bundle (using the
  VoiceInteractionSession.KEY_AUTO_FILL_CALLBACK key).
- The app-visible AutoFillService class offers an onFillRequest() method,
  which contains the assist data and a FillCallback used to handle it.

BUG: 31001899
Test: manually built and ran it

Change-Id: I3d208c14e81022dc96dd03f38bbe25a778b24a67
parent 7519e166
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -251,6 +251,7 @@ 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/IAutoFillManagerService.aidl \
	core/java/android/service/autofill/IAutoFillService.aidl \
	core/java/android/service/carrier/ICarrierService.aidl \
+16 −2
Original line number Diff line number Diff line
@@ -6265,6 +6265,7 @@ package android.app.assist {
  public static class AssistStructure.ViewNode {
    method public float getAlpha();
    method public int getAutoFillId();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -34641,13 +34642,26 @@ package android.service.autofill {
  public abstract class AutoFillService extends android.app.Service {
    ctor public AutoFillService();
    method public final android.os.IBinder onBind(android.content.Intent);
    method public void onNewSession(java.lang.String, android.os.Bundle, int, android.app.assist.AssistStructure);
    method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.CancellationSignal, android.service.autofill.FillCallback);
    method public void onReady();
    method public void onSessionFinished(java.lang.String);
    method public void onShutdown();
    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);
  }
}
package android.service.carrier {
+16 −2
Original line number Diff line number Diff line
@@ -6456,6 +6456,7 @@ package android.app.assist {
  public static class AssistStructure.ViewNode {
    method public float getAlpha();
    method public int getAutoFillId();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -37434,13 +37435,26 @@ package android.service.autofill {
  public abstract class AutoFillService extends android.app.Service {
    ctor public AutoFillService();
    method public final android.os.IBinder onBind(android.content.Intent);
    method public void onNewSession(java.lang.String, android.os.Bundle, int, android.app.assist.AssistStructure);
    method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.CancellationSignal, android.service.autofill.FillCallback);
    method public void onReady();
    method public void onSessionFinished(java.lang.String);
    method public void onShutdown();
    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);
  }
}
package android.service.carrier {
+16 −2
Original line number Diff line number Diff line
@@ -6281,6 +6281,7 @@ package android.app.assist {
  public static class AssistStructure.ViewNode {
    method public float getAlpha();
    method public int getAutoFillId();
    method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
    method public int getChildCount();
    method public java.lang.String getClassName();
@@ -34731,13 +34732,26 @@ package android.service.autofill {
  public abstract class AutoFillService extends android.app.Service {
    ctor public AutoFillService();
    method public final android.os.IBinder onBind(android.content.Intent);
    method public void onNewSession(java.lang.String, android.os.Bundle, int, android.app.assist.AssistStructure);
    method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.CancellationSignal, android.service.autofill.FillCallback);
    method public void onReady();
    method public void onSessionFinished(java.lang.String);
    method public void onShutdown();
    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);
  }
}
package android.service.carrier {
+65 −6
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.hardware.input.InputManager;
import android.media.AudioManager;
import android.media.session.MediaController;
import android.net.Uri;
@@ -70,6 +69,9 @@ import android.os.ServiceManager.ServiceNotFoundException;
import android.os.StrictMode;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.service.autofill.FillableInputField;
import android.service.autofill.AutoFillService;
import android.service.autofill.IAutoFillCallback;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@@ -90,8 +92,6 @@ import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper;
import android.view.DragAndDropPermissions;
import android.view.DragEvent;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup;
import android.view.KeyboardShortcutInfo;
@@ -113,9 +113,11 @@ import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.Toolbar;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.ToolbarActionBar;
import com.android.internal.app.WindowDecorActionBar;
@@ -802,11 +804,13 @@ public class Activity extends ContextThemeWrapper
        private boolean mReleased;
        private boolean mUpdated;
    }
    private final ArrayList<ManagedCursor> mManagedCursors =
        new ArrayList<ManagedCursor>();

    // protected by synchronized (this)
    @GuardedBy("mManagedCursors")
    private final ArrayList<ManagedCursor> mManagedCursors = new ArrayList<>();

    @GuardedBy("this")
    int mResultCode = RESULT_CANCELED;
    @GuardedBy("this")
    Intent mResultData = null;

    private TranslucentConversionListener mTranslucentCallback;
@@ -837,6 +841,9 @@ public class Activity extends ContextThemeWrapper
    private boolean mHasCurrentPermissionsRequest;
    private boolean mEatKeyUpEvent;

    @GuardedBy("this")
    private IAutoFillCallback mAutoFillCallback;

    private static native String getDlWarning();

    /** Return the intent that started this activity. */
@@ -1687,6 +1694,53 @@ public class Activity extends ContextThemeWrapper
    public void onProvideAssistContent(AssistContent outContent) {
    }

    /**
     * Lazily gets the {@code IAutoFillCallback} for this activitity.
     *
     * <p>This callback is used by the {@link AutoFillService} app to auto-fill the activity fields.
     */
    IAutoFillCallback getAutoFillCallback() {
        synchronized (this) {
            if (mAutoFillCallback == null) {
                mAutoFillCallback = new IAutoFillCallback.Stub() {
                    @Override
                    public void autofill(@SuppressWarnings("rawtypes") List fields)
                            throws RemoteException {
                        runOnUiThread(() -> {
                            final View root = getWindow().getDecorView().getRootView();
                            for (Object field : fields) {
                                if (!(field instanceof FillableInputField)) {
                                    Slog.w(TAG,  "autofill(): invalid type " + field.getClass());
                                    continue;
                                }
                                FillableInputField autoFillField = (FillableInputField) field;
                                final int viewId = autoFillField.getId();
                                final View view = root.findViewByAccessibilityIdTraversal(viewId);
                                // TODO: should handle other types of view as well, but that will
                                // require:
                                // - a new interface like AutoFillable
                                // - a way for the views to define the type of the autofield value
                                if ((view instanceof EditText)) {
                                    ((EditText) view).setText(autoFillField.getValue());
                                }
                            }
                        });
                    }

                    @Override
                    public void showError(String message) {
                        runOnUiThread(() -> {
                            // TODO: temporary show a toast until it uses the Snack bar.
                            Toast.makeText(Activity.this, "Auto-fill request failed: " + message,
                                    Toast.LENGTH_LONG).show();
                        });
                    }
                };
            }
        }
        return mAutoFillCallback;
    }

    /**
     * Request the Keyboard Shortcuts screen to show up. This will trigger
     * {@link #onProvideKeyboardShortcuts} to retrieve the shortcuts for the foreground activity.
@@ -5974,6 +6028,11 @@ public class Activity extends ContextThemeWrapper
            getWindow().peekDecorView().getViewRootImpl().dump(prefix, fd, writer, args);
        }

        if (mAutoFillCallback != null) {
            writer.print(prefix); writer.print("mAutoFillCallback: " );
                    writer.println(mAutoFillCallback);
        }

        mHandler.getLooper().dump(new PrintWriterPrinter(writer), prefix);
    }

Loading