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

Commit 782043ca authored by Svet Ganov's avatar Svet Ganov
Browse files

Refactor auto-fill

* Fix a layering issue where auto-fill manager which is in view
  depended on activity which is in app

* Moved auto-fill classes to view or service based on their
  purpose and removed dependecy on the classes in view to the
  classes in service

* Push state to local auto-fill manager whether auto-fill is
  enabled to avoid making IPC for every focus transition if
  the user did not enable the feature

* Remove unnecessary offload to messages when handling calls
  to auto-fill manager service as these are made over a oneway
  interface and in general they do almost no work and typically
  we do these on the binder thread

* Removed id from data set and fill response as the provider
  can embed everything it needs to id them in the auth pending
  intent

* Enforce the auth UI to be only an activity as this will work
  with multi-window, recents, and back and also does not require
  draw on top of other app special permission

* Authentication also no longer requires passing a remotable
  callback to the auth activity but the activity handles the
  request as if called for a result

* Handling stopping of a user to clean up in-memory state as
  well as handling when a user gets unlocked as a provider may
  be non-direct boot aware

* User the correct context when creating an auto-fill manager

* Move the receiver that listens for requests to hide system
  windows to the manager service as the UI is a singleton and
  no need every per-user state to register its own

* Removed extras from dataset as the only case a provider needs
  to associate state with a dataset is for auth and the provider
  can embed this data in the auth pending intent

Test: manual and CTS

Change-Id: I4bc54c13cf779d7f6fdb3ab894637f9fac73f603
parent 9b661129
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -264,8 +264,6 @@ 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/IAutoFillAppCallback.aidl \
	core/java/android/service/autofill/IAutoFillManagerService.aidl \
	core/java/android/service/autofill/IAutoFillService.aidl \
	core/java/android/service/autofill/IFillCallback.aidl \
	core/java/android/service/autofill/ISaveCallback.aidl \
@@ -318,6 +316,8 @@ LOCAL_SRC_FILES += \
	core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl\
	core/java/android/view/accessibility/IAccessibilityManager.aidl \
	core/java/android/view/accessibility/IAccessibilityManagerClient.aidl \
	core/java/android/view/autofill/IAutoFillManager.aidl \
	core/java/android/view/autofill/IAutoFillManagerClient.aidl \
	core/java/android/view/IApplicationToken.aidl \
	core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl \
	core/java/android/view/IDockedStackListener.aidl \
+30 −36
Original line number Diff line number Diff line
@@ -9181,10 +9181,6 @@ package android.content {
    field public static final java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
    field public static final java.lang.String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
    field public static final java.lang.String EXTRA_ASSIST_UID = "android.intent.extra.ASSIST_UID";
    field public static final java.lang.String EXTRA_AUTO_FILL_ASSIST_STRUCTURE = "android.intent.extra.AUTO_FILL_ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTO_FILL_CALLBACK = "android.intent.extra.AUTO_FILL_CALLBACK";
    field public static final java.lang.String EXTRA_AUTO_FILL_EXTRAS = "android.intent.extra.AUTO_FILL_EXTRAS";
    field public static final java.lang.String EXTRA_AUTO_FILL_ITEM_ID = "android.intent.extra.AUTO_FILL_ITEM_ID";
    field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
    field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
    field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
@@ -36199,12 +36195,37 @@ package android.service.autofill {
    field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
  }
  public final class FillCallback implements android.os.Parcelable {
  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.service.autofill.Dataset> CREATOR;
  }
  public static final class Dataset.Builder {
    ctor public Dataset.Builder(java.lang.CharSequence);
    method public android.service.autofill.Dataset build();
    method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
  }
  public final class FillCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.FillResponse);
    method public void onSuccess(android.service.autofill.FillResponse);
  }
  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.service.autofill.FillCallback> CREATOR;
    field public static final android.os.Parcelable.Creator<android.service.autofill.FillResponse> CREATOR;
  }
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
    method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
    method public android.service.autofill.FillResponse build();
    method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
  public final class SaveCallback {
@@ -46838,6 +46859,8 @@ package android.view.autofill {
    method public void valueChanged(android.view.View);
    method public void virtualFocusChanged(android.view.View, int, android.graphics.Rect, boolean);
    method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
    field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
  }
  public final class AutoFillType implements android.os.Parcelable {
@@ -46865,35 +46888,6 @@ package android.view.autofill {
    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.String, java.lang.CharSequence);
    method public android.view.autofill.Dataset build();
    method public android.view.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    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(java.lang.String);
    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 setAuthentication(android.content.IntentSender);
    method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
}
package android.view.inputmethod {
+30 −36
Original line number Diff line number Diff line
@@ -9619,10 +9619,6 @@ package android.content {
    field public static final java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
    field public static final java.lang.String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
    field public static final java.lang.String EXTRA_ASSIST_UID = "android.intent.extra.ASSIST_UID";
    field public static final java.lang.String EXTRA_AUTO_FILL_ASSIST_STRUCTURE = "android.intent.extra.AUTO_FILL_ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTO_FILL_CALLBACK = "android.intent.extra.AUTO_FILL_CALLBACK";
    field public static final java.lang.String EXTRA_AUTO_FILL_EXTRAS = "android.intent.extra.AUTO_FILL_EXTRAS";
    field public static final java.lang.String EXTRA_AUTO_FILL_ITEM_ID = "android.intent.extra.AUTO_FILL_ITEM_ID";
    field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
    field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
    field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
@@ -39265,12 +39261,37 @@ package android.service.autofill {
    field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
  }
  public final class FillCallback implements android.os.Parcelable {
  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.service.autofill.Dataset> CREATOR;
  }
  public static final class Dataset.Builder {
    ctor public Dataset.Builder(java.lang.CharSequence);
    method public android.service.autofill.Dataset build();
    method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
  }
  public final class FillCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.FillResponse);
    method public void onSuccess(android.service.autofill.FillResponse);
  }
  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.service.autofill.FillCallback> CREATOR;
    field public static final android.os.Parcelable.Creator<android.service.autofill.FillResponse> CREATOR;
  }
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
    method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
    method public android.service.autofill.FillResponse build();
    method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
  public final class SaveCallback {
@@ -50277,6 +50298,8 @@ package android.view.autofill {
    method public void valueChanged(android.view.View);
    method public void virtualFocusChanged(android.view.View, int, android.graphics.Rect, boolean);
    method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
    field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
  }
  public final class AutoFillType implements android.os.Parcelable {
@@ -50304,35 +50327,6 @@ package android.view.autofill {
    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.String, java.lang.CharSequence);
    method public android.view.autofill.Dataset build();
    method public android.view.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    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(java.lang.String);
    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 setAuthentication(android.content.IntentSender);
    method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
}
package android.view.inputmethod {
+30 −36
Original line number Diff line number Diff line
@@ -9207,10 +9207,6 @@ package android.content {
    field public static final java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
    field public static final java.lang.String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
    field public static final java.lang.String EXTRA_ASSIST_UID = "android.intent.extra.ASSIST_UID";
    field public static final java.lang.String EXTRA_AUTO_FILL_ASSIST_STRUCTURE = "android.intent.extra.AUTO_FILL_ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTO_FILL_CALLBACK = "android.intent.extra.AUTO_FILL_CALLBACK";
    field public static final java.lang.String EXTRA_AUTO_FILL_EXTRAS = "android.intent.extra.AUTO_FILL_EXTRAS";
    field public static final java.lang.String EXTRA_AUTO_FILL_ITEM_ID = "android.intent.extra.AUTO_FILL_ITEM_ID";
    field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
    field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
    field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
@@ -36334,12 +36330,37 @@ package android.service.autofill {
    field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
  }
  public final class FillCallback implements android.os.Parcelable {
  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.service.autofill.Dataset> CREATOR;
  }
  public static final class Dataset.Builder {
    ctor public Dataset.Builder(java.lang.CharSequence);
    method public android.service.autofill.Dataset build();
    method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
  }
  public final class FillCallback {
    method public void onFailure(java.lang.CharSequence);
    method public void onSuccess(android.view.autofill.FillResponse);
    method public void onSuccess(android.service.autofill.FillResponse);
  }
  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.service.autofill.FillCallback> CREATOR;
    field public static final android.os.Parcelable.Creator<android.service.autofill.FillResponse> CREATOR;
  }
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset);
    method public android.service.autofill.FillResponse.Builder addSavableFields(android.view.autofill.AutoFillId...);
    method public android.service.autofill.FillResponse build();
    method public android.service.autofill.FillResponse.Builder setAuthentication(android.content.IntentSender);
    method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
  public final class SaveCallback {
@@ -47151,6 +47172,8 @@ package android.view.autofill {
    method public void valueChanged(android.view.View);
    method public void virtualFocusChanged(android.view.View, int, android.graphics.Rect, boolean);
    method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
    field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
    field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
  }
  public final class AutoFillType implements android.os.Parcelable {
@@ -47178,35 +47201,6 @@ package android.view.autofill {
    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.String, java.lang.CharSequence);
    method public android.view.autofill.Dataset build();
    method public android.view.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
    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(java.lang.String);
    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 setAuthentication(android.content.IntentSender);
    method public android.view.autofill.FillResponse.Builder setExtras(android.os.Bundle);
  }
}
package android.view.inputmethod {
+45 −33
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package android.app;

import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillManager;
import android.view.autofill.AutoFillValue;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.ToolbarActionBar;
@@ -113,8 +116,6 @@ import android.view.Window.WindowControllerCallback;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
import android.view.autofill.AutoFillManager;
import android.view.autofill.AutoFillSession;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.Toolbar;
@@ -688,7 +689,8 @@ public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback, WindowControllerCallback {
        Window.OnWindowDismissedCallback, WindowControllerCallback,
        AutoFillManager.AutoFillClient {
    private static final String TAG = "Activity";
    private static final boolean DEBUG_LIFECYCLE = false;

@@ -726,6 +728,7 @@ public class Activity extends ContextThemeWrapper
            "android:hasCurrentPermissionsRequest";

    private static final String REQUEST_PERMISSIONS_WHO_PREFIX = "@android:requestPermissions:";
    private static final String AUTO_FILL_AUTH_WHO_PREFIX = "@android:autoFillAuth:";

    private static final String KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME = "com.android.systemui";

@@ -841,9 +844,6 @@ public class Activity extends ContextThemeWrapper

    private boolean mHasCurrentPermissionsRequest;

    @GuardedBy("this")
    private AutoFillSession mAutoFillSession;

    private static native String getDlWarning();

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

    /**
     * Lazily attachs the activity to the current {@link AutoFillSession} (if any).
     */
    void attachToAutoFillSession() {
        synchronized (this) {
            if (mAutoFillSession == null) {
                final AutoFillManager afm = getSystemService(AutoFillManager.class);
                if (afm != null) {
                    mAutoFillSession = afm.getSession();
                    if (mAutoFillSession != null) {
                        mAutoFillSession.attachActivity(this);
                    } else {
                        Log.w(TAG, "attachToAutoFillSession(): not in a session");
                    }
                }
            }
        }
    }

    /**
     * Request the Keyboard Shortcuts screen to show up. This will trigger
     * {@link #onProvideKeyboardShortcuts} to retrieve the shortcuts for the foreground activity.
@@ -1799,9 +1780,8 @@ public class Activity extends ContextThemeWrapper
        getApplication().dispatchActivityStopped(this);
        mTranslucentCallback = null;
        mCalled = true;
        if (mAutoFillSession != null && isFinishing()) {
            mAutoFillSession.finishSession();
            mAutoFillSession = null;
        if (isFinishing() && AutoFillManager.isClientActive(getActivityToken())) {
            getSystemService(AutoFillManager.class).reset();
        }
    }

@@ -6021,11 +6001,6 @@ public class Activity extends ContextThemeWrapper
            getWindow().peekDecorView().getViewRootImpl().dump(prefix, fd, writer, args);
        }

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

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

@@ -6748,6 +6723,8 @@ public class Activity extends ContextThemeWrapper
        mCurrentConfig = config;

        mWindow.setColorMode(info.colorMode);

        AutoFillManager.addClient(token, this);
    }

    /** @hide */
@@ -7038,6 +7015,8 @@ public class Activity extends ContextThemeWrapper
                    return;
                }
            }
        } else if (who.startsWith(AUTO_FILL_AUTH_WHO_PREFIX)) {
            getSystemService(AutoFillManager.class).onAuthenticationResult(data);
        } else {
            Fragment frag = mFragments.findFragmentByWho(who);
            if (frag != null) {
@@ -7178,6 +7157,39 @@ public class Activity extends ContextThemeWrapper
        fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    /** @hide */
    @Override
    public void autoFill(List<AutoFillId> ids, List<AutoFillValue> values) {
        final View root = getWindow().getDecorView();
        final int itemCount = ids.size();
        for (int i = 0; i < itemCount; i++) {
            final AutoFillId id = ids.get(i);
            final AutoFillValue value = values.get(i);
            final int viewId = id.getViewId();
            final View view = root.findViewByAccessibilityIdTraversal(viewId);
            if (view == null) {
                Log.w(TAG, "autoFill(): no View with id " + viewId);
                continue;
            }
            if (id.isVirtual()) {
                view.autoFillVirtual(id.getVirtualChildId(), value);
            } else {
                view.autoFill(value);
            }
        }
    }

    /** @hide */
    @Override
    public void authenticate(IntentSender intent, Intent fillInIntent) {
        try {
            startIntentSenderForResultInner(intent, AUTO_FILL_AUTH_WHO_PREFIX,
                    0, fillInIntent, 0, 0, null);
        } catch (IntentSender.SendIntentException e) {
            Log.e(TAG, "authenticate() failed for intent:" + intent, e);
        }
    }

    class HostCallbacks extends FragmentHostCallback<Activity> {
        public HostCallbacks() {
            super(Activity.this /*activity*/);
Loading