diff options
10 files changed, 177 insertions, 182 deletions
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index 0ad790b4002e..33535302bd5c 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -64,6 +64,7 @@ public class AssistStructure implements Parcelable { ComponentName mActivityComponent; private boolean mIsHomeActivity; + private int mFlags; final ArrayList<WindowNode> mWindowNodes = new ArrayList<>(); @@ -186,6 +187,7 @@ public class AssistStructure implements Parcelable { mSanitizeOnWrite = as.mSanitizeOnWrite; mWriteStructure = as.waitForReady(); ComponentName.writeToParcel(as.mActivityComponent, out); + out.writeInt(as.mFlags); out.writeLong(as.mAcquisitionStartTime); out.writeLong(as.mAcquisitionEndTime); mNumWindows = as.mWindowNodes.size(); @@ -340,6 +342,7 @@ public class AssistStructure implements Parcelable { void go() { fetchData(); mActivityComponent = ComponentName.readFromParcel(mCurParcel); + mFlags = mCurParcel.readInt(); mAcquisitionStartTime = mCurParcel.readLong(); mAcquisitionEndTime = mCurParcel.readLong(); final int N = mCurParcel.readInt(); @@ -1876,6 +1879,7 @@ public class AssistStructure implements Parcelable { public AssistStructure(Activity activity, boolean forAutoFill, int flags) { mHaveData = true; mActivityComponent = activity.getComponentName(); + mFlags = flags; ArrayList<ViewRootImpl> views = WindowManagerGlobal.getInstance().getRootViews( activity.getActivityToken()); for (int i=0; i<views.size(); i++) { @@ -1887,6 +1891,7 @@ public class AssistStructure implements Parcelable { public AssistStructure() { mHaveData = true; mActivityComponent = null; + mFlags = 0; } /** @hide */ @@ -1913,6 +1918,7 @@ public class AssistStructure implements Parcelable { } Log.i(TAG, "Activity: " + mActivityComponent.flattenToShortString()); Log.i(TAG, "Sanitize on write: " + mSanitizeOnWrite); + Log.i(TAG, "Flags: " + mFlags); final int N = getWindowNodeCount(); for (int i=0; i<N; i++) { WindowNode node = getWindowNodeAt(i); @@ -2025,6 +2031,11 @@ public class AssistStructure implements Parcelable { return mActivityComponent; } + /** @hide */ + public int getFlags() { + return mFlags; + } + /** * Returns whether the activity associated with this AssistStructure was the home activity * (Launcher) at the time the assist data was acquired. diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java index 8a28c45d145f..e482c78f0bb2 100644 --- a/core/java/android/service/autofill/FillContext.java +++ b/core/java/android/service/autofill/FillContext.java @@ -74,11 +74,9 @@ public final class FillContext implements Parcelable { @Override public String toString() { - if (!DEBUG) { - return super.toString(); - } else { - return "FillContext [mRequestId=" + mRequestId + "]"; - } + if (!DEBUG) return super.toString(); + + return "FillContext [reqId=" + mRequestId + "]"; } @Override diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 2c8e43ed13a3..b1c9d69e25af 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -107,11 +107,10 @@ public final class AutofillManager { @Deprecated public static final int FLAG_MANUAL_REQUEST = 0x1; - // TODO(b/37563972): start from 0x1 once FLAG_MANUAL_REQUEST is gone - /** @hide */ public static final int FLAG_START_SESSION = 0x80000000; - /** @hide */ public static final int FLAG_VIEW_ENTERED = 0x40000000; - /** @hide */ public static final int FLAG_VIEW_EXITED = 0x20000000; - /** @hide */ public static final int FLAG_VALUE_CHANGED = 0x10000000; + /** @hide */ public static final int ACTION_START_SESSION = 1; + /** @hide */ public static final int ACTION_VIEW_ENTERED = 2; + /** @hide */ public static final int ACTION_VIEW_EXITED = 3; + /** @hide */ public static final int ACTION_VALUE_CHANGED = 4; private final MetricsLogger mMetricsLogger = new MetricsLogger(); @@ -404,7 +403,7 @@ public final class AutofillManager { startSessionLocked(id, view.getWindowToken(), null, value, flags); } else { // Update focus on existing session. - updateSessionLocked(id, null, value, FLAG_VIEW_ENTERED); + updateSessionLocked(id, null, value, ACTION_VIEW_ENTERED, flags); } } } @@ -430,7 +429,7 @@ public final class AutofillManager { final AutofillId id = getAutofillId(view); // Update focus on existing session. - updateSessionLocked(id, null, null, FLAG_VIEW_EXITED); + updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0); } } } @@ -482,7 +481,7 @@ public final class AutofillManager { startSessionLocked(id, view.getWindowToken(), bounds, null, flags); } else { // Update focus on existing session. - updateSessionLocked(id, bounds, null, FLAG_VIEW_ENTERED); + updateSessionLocked(id, bounds, null, ACTION_VIEW_ENTERED, flags); } } } @@ -510,7 +509,7 @@ public final class AutofillManager { final AutofillId id = getAutofillId(view, childId); // Update focus on existing session. - updateSessionLocked(id, null, null, FLAG_VIEW_EXITED); + updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0); } } } @@ -562,7 +561,7 @@ public final class AutofillManager { value = view.getAutofillValue(); } - updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED); + updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0); } } @@ -583,7 +582,7 @@ public final class AutofillManager { } final AutofillId id = getAutofillId(view, childId); - updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED); + updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0); } } @@ -726,7 +725,7 @@ public final class AutofillManager { mSessionId = mService.startSession(mContext.getActivityToken(), windowToken, mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(), mCallback != null, flags, mContext.getOpPackageName()); - AutofillClient client = getClientLocked(); + final AutofillClient client = getClientLocked(); if (client != null) { client.autofillCallbackResetableStateAvailable(); } @@ -769,16 +768,18 @@ public final class AutofillManager { mTrackedViews = null; } - private void updateSessionLocked(AutofillId id, Rect bounds, AutofillValue value, int flags) { + private void updateSessionLocked(AutofillId id, Rect bounds, AutofillValue value, int action, + int flags) { if (DEBUG) { - if (VERBOSE || (flags & FLAG_VIEW_EXITED) != 0) { + if (VERBOSE || action != ACTION_VIEW_EXITED) { Log.d(TAG, "updateSessionLocked(): id=" + id + ", bounds=" + bounds - + ", value=" + value + ", flags=" + flags); + + ", value=" + value + ", action=" + action + ", flags=" + flags); } } try { - mService.updateSession(mSessionId, id, bounds, value, flags, mContext.getUserId()); + mService.updateSession(mSessionId, id, bounds, value, action, flags, + mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl index 9417bd07a267..6e121ac6983f 100644 --- a/core/java/android/view/autofill/IAutoFillManager.aidl +++ b/core/java/android/view/autofill/IAutoFillManager.aidl @@ -38,7 +38,7 @@ interface IAutoFillManager { boolean restoreSession(int sessionId, in IBinder activityToken, in IBinder appCallback); void setWindow(int sessionId, in IBinder windowToken); void updateSession(int sessionId, in AutofillId id, in Rect bounds, - in AutofillValue value, int flags, int userId); + in AutofillValue value, int action, int flags, int userId); void finishSession(int sessionId, int userId); void cancelSession(int sessionId, int userId); void setAuthenticationResult(in Bundle data, int sessionId, int userId); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index 8a20c854a6cc..8d65ded1d1ad 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -509,12 +509,12 @@ public final class AutofillManagerService extends SystemService { @Override public void updateSession(int sessionId, AutofillId id, Rect bounds, - AutofillValue value, int flags, int userId) { + AutofillValue value, int action, int flags, int userId) { synchronized (mLock) { final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId); if (service != null) { service.updateSessionLocked(sessionId, getCallingUid(), id, bounds, value, - flags); + action, flags); } } } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 44a296e79b57..500ddb287cd6 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -16,7 +16,7 @@ package com.android.server.autofill; -import static android.view.autofill.AutofillManager.FLAG_START_SESSION; +import static android.view.autofill.AutofillManager.ACTION_START_SESSION; import static android.view.autofill.AutofillManager.NO_SESSION; import static com.android.server.autofill.Helper.DEBUG; @@ -271,14 +271,14 @@ final class AutofillManagerServiceImpl { } final String historyItem = - "id=" + newSession.getId() + " uid=" + uid + " s=" + mInfo.getServiceInfo().packageName + "id=" + newSession.id + " uid=" + uid + " s=" + mInfo.getServiceInfo().packageName + " u=" + mUserId + " i=" + autofillId + " b=" + virtualBounds + " hc=" + hasCallback + " f=" + flags; mRequestsHistory.log(historyItem); - newSession.updateLocked(autofillId, virtualBounds, value, FLAG_START_SESSION); + newSession.updateLocked(autofillId, virtualBounds, value, ACTION_START_SESSION, flags); - return newSession.getId(); + return newSession.id; } void finishSessionLocked(int sessionId, int uid) { @@ -350,9 +350,9 @@ final class AutofillManagerServiceImpl { } while (sessionId == NO_SESSION || mSessions.indexOfKey(sessionId) >= 0); final Session newSession = new Session(this, mUi, mContext, mHandlerCaller, mUserId, mLock, - sessionId, uid, activityToken, windowToken, appCallbackToken, hasCallback, flags, + sessionId, uid, activityToken, windowToken, appCallbackToken, hasCallback, mInfo.getServiceInfo().getComponentName(), packageName); - mSessions.put(newSession.getId(), newSession); + mSessions.put(newSession.id, newSession); return newSession; } @@ -396,7 +396,7 @@ final class AutofillManagerServiceImpl { } void updateSessionLocked(int sessionId, int uid, AutofillId autofillId, Rect virtualBounds, - AutofillValue value, int flags) { + AutofillValue value, int action, int flags) { final Session session = mSessions.get(sessionId); if (session == null || session.uid != uid) { if (VERBOSE) { @@ -406,7 +406,7 @@ final class AutofillManagerServiceImpl { return; } - session.updateLocked(autofillId, virtualBounds, value, flags); + session.updateLocked(autofillId, virtualBounds, value, action, flags); } void removeSessionLocked(int sessionId) { diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index 2aeb07e1057b..f6831b2ef6ab 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -89,7 +89,7 @@ final class RemoteFillService implements DeathRecipient { private PendingRequest mPendingRequest; public interface FillServiceCallbacks { - void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid, + void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response, int serviceUid, @NonNull String servicePackageName); void onFillRequestFailure(@Nullable CharSequence message, @NonNull String servicePackageName); @@ -281,10 +281,10 @@ final class RemoteFillService implements DeathRecipient { } private void dispatchOnFillRequestSuccess(PendingRequest pendingRequest, - int callingUid, FillResponse response) { + int callingUid, int requestFlags, FillResponse response) { mHandler.getHandler().post(() -> { if (handleResponseCallbackCommon(pendingRequest)) { - mCallbacks.onFillRequestSuccess(response, callingUid, + mCallbacks.onFillRequestSuccess(requestFlags, response, callingUid, mComponentName.getPackageName()); } }); @@ -452,8 +452,8 @@ final class RemoteFillService implements DeathRecipient { public void onSuccess(FillResponse response) { RemoteFillService remoteService = mWeakService.get(); if (remoteService != null) { - remoteService.dispatchOnFillRequestSuccess( - PendingFillRequest.this, getCallingUid(), response); + remoteService.dispatchOnFillRequestSuccess(PendingFillRequest.this, + getCallingUid(), request.getFlags(), response); } } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 5a322740fdc5..eb95684ecaa1 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -20,10 +20,10 @@ import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; import static android.service.autofill.FillRequest.INVALID_REQUEST_ID; import static android.service.voice.VoiceInteractionSession.KEY_RECEIVER_EXTRAS; import static android.service.voice.VoiceInteractionSession.KEY_STRUCTURE; -import static android.view.autofill.AutofillManager.FLAG_START_SESSION; -import static android.view.autofill.AutofillManager.FLAG_VALUE_CHANGED; -import static android.view.autofill.AutofillManager.FLAG_VIEW_ENTERED; -import static android.view.autofill.AutofillManager.FLAG_VIEW_EXITED; +import static android.view.autofill.AutofillManager.ACTION_START_SESSION; +import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED; +import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED; +import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED; import static com.android.server.autofill.Helper.DEBUG; import static com.android.server.autofill.Helper.VERBOSE; @@ -108,7 +108,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private static AtomicInteger sIdCounter = new AtomicInteger(); /** Id of the session */ - private final int mId; + public final int id; /** uid the session is for */ public final int uid; @@ -174,23 +174,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private boolean mDestroyed; /** - * Flags used to start the session. - */ - private final int mFlags; - - /** * Receiver of assist data from the app's {@link Activity}. */ private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() { @Override public void send(int resultCode, Bundle resultData) throws RemoteException { - if (VERBOSE) { - Slog.v(TAG, "resultCode on mAssistReceiver: " + resultCode); - } - final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE); if (structure == null) { - Slog.wtf(TAG, "no assist structure for id " + resultCode); + Slog.wtf(TAG, "no assist structure"); return; } @@ -218,6 +209,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Sanitize structure before it's sent to service. structure.sanitizeForParceling(true); + // Flags used to start the session. + final int flags = structure.getFlags(); + if (mContexts == null) { mContexts = new ArrayList<>(1); } @@ -230,7 +224,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState fillStructureWithAllowedValues(mContexts.get(i).getStructure()); } - request = new FillRequest(requestId, mContexts, mClientState, mFlags); + request = new FillRequest(requestId, mContexts, mClientState, flags); } mRemoteFillService.onFillRequest(request); @@ -295,7 +289,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** * Reads a new structure and then request a new fill response from the fill service. */ - private void requestNewFillResponseLocked() { + private void requestNewFillResponseLocked(int flags) { int requestId; do { @@ -303,7 +297,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } while (requestId == INVALID_REQUEST_ID); if (DEBUG) { - Slog.d(TAG, "Requesting structure for requestId " + requestId); + Slog.d(TAG, "Requesting structure for requestId=" + requestId + ", flags=" + flags); } // If the focus changes very quickly before the first request is returned each focus change @@ -319,7 +313,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final long identity = Binder.clearCallingIdentity(); try { if (!ActivityManager.getService().requestAutofillData(mAssistReceiver, - receiverExtras, mActivityToken, mFlags)) { + receiverExtras, mActivityToken, flags)) { Slog.w(TAG, "failed to request autofill data for " + mActivityToken); } } finally { @@ -334,8 +328,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @NonNull Context context, @NonNull HandlerCaller handlerCaller, int userId, @NonNull Object lock, int sessionId, int uid, @NonNull IBinder activityToken, @Nullable IBinder windowToken, @NonNull IBinder client, boolean hasCallback, - int flags, @NonNull ComponentName componentName, @NonNull String packageName) { - mId = sessionId; + @NonNull ComponentName componentName, @NonNull String packageName) { + id = sessionId; this.uid = uid; mService = service; mLock = lock; @@ -346,7 +340,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mWindowToken = windowToken; mHasCallback = hasCallback; mPackageName = packageName; - mFlags = flags; mClient = IAutoFillManagerClient.Stub.asInterface(client); mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_STARTED, mPackageName); @@ -371,7 +364,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#switchWindow() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mWindowToken = newWindow; @@ -388,7 +381,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#switchActivity() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mActivityToken = newActivity; @@ -401,17 +394,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // FillServiceCallbacks @Override - public void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid, - @NonNull String servicePackageName) { + public void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response, + int serviceUid, @NonNull String servicePackageName) { synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onFillRequestSuccess() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } if (response == null) { - if ((mFlags & FLAG_MANUAL_REQUEST) != 0) { + if ((requestFlags & FLAG_MANUAL_REQUEST) != 0) { getUiForShowing().showError(R.string.autofill_error_cannot_autofill); } // Nothing to be done, but need to notify client. @@ -452,7 +445,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onFillRequestFailure() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -472,7 +465,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onSaveRequestSuccess() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -494,7 +487,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onSaveRequestFailure() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -541,7 +534,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#authenticate() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -566,7 +559,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#fill() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -579,12 +572,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#save() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } mHandlerCaller.getHandler() - .obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, mId, 0) + .obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, id, 0) .sendToTarget(); } @@ -594,7 +587,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#cancelSave() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -608,13 +601,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#requestShowFillUi() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } if (id.equals(mCurrentViewId)) { try { final ViewState view = mViewStates.get(id); - mClient.requestShowFillUi(mId, mWindowToken, id, width, height, + mClient.requestShowFillUi(this.id, mWindowToken, id, width, height, view.getVirtualBounds(), presenter); } catch (RemoteException e) { Slog.e(TAG, "Error requesting to show fill UI", e); @@ -635,7 +628,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // NOTE: We allow this call in a destroyed state as the UI is // asked to go away after we get destroyed, so let it do that. try { - mClient.requestHideFillUi(mId, mWindowToken, id); + mClient.requestHideFillUi(this.id, mWindowToken, id); } catch (RemoteException e) { Slog.e(TAG, "Error requesting to hide fill UI", e); } @@ -648,7 +641,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#startIntentSender() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } removeSelfLocked(); @@ -667,7 +660,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void setAuthenticationResultLocked(Bundle data) { if (mDestroyed) { Slog.w(TAG, "Call to Session#setAuthenticationResultLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } if ((mResponseWaitingAuth == null && mDatasetWaitingAuth == null) || data == null) { @@ -707,7 +700,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void setHasCallbackLocked(boolean hasIt) { if (mDestroyed) { Slog.w(TAG, "Call to Session#setHasCallbackLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mHasCallback = hasIt; @@ -721,7 +714,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState public boolean showSaveLocked() { if (mDestroyed) { Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return false; } if (mContexts == null) { @@ -845,7 +838,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void callSaveLocked() { if (mDestroyed) { Slog.w(TAG, "Call to Session#callSaveLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } @@ -932,7 +925,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final int numDatasets = datasets.size(); for (int dataSetNum = 0; dataSetNum < numDatasets; dataSetNum++) { - final ArrayList fields = datasets.get(dataSetNum).getFieldIds(); + final ArrayList<AutofillId> fields = datasets.get(dataSetNum).getFieldIds(); if (fields != null && fields.contains(id)) { return false; @@ -944,96 +937,92 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return true; } - void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int flags) { + void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int action, + int flags) { if (mDestroyed) { Slog.w(TAG, "Call to Session#updateLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } ViewState viewState = mViewStates.get(id); if (viewState == null) { - if ((flags & (FLAG_START_SESSION | FLAG_VALUE_CHANGED | FLAG_VIEW_ENTERED)) != 0) { + if (action == ACTION_START_SESSION || action == ACTION_VALUE_CHANGED + || action == ACTION_VIEW_ENTERED) { if (DEBUG) { - Slog.d(TAG, "Creating viewState for " + id + " on " + getFlagAsString(flags)); + Slog.d(TAG, + "Creating viewState for " + id + " on " + getActionAsString(action)); } viewState = new ViewState(this, id, value, this, ViewState.STATE_INITIAL); mViewStates.put(id, viewState); } else { - if (VERBOSE) Slog.v(TAG, "Ignored " + getFlagAsString(flags) + " for " + id); + if (VERBOSE) Slog.v(TAG, "Ignored " + getActionAsString(action) + " for " + id); return; } } - if ((flags & FLAG_START_SESSION) != 0) { - // View is triggering autofill. - mCurrentViewId = viewState.id; - viewState.update(value, virtualBounds); - viewState.setState(ViewState.STATE_STARTED_SESSION); - requestNewFillResponseLocked(); - return; - } - - if ((flags & FLAG_VALUE_CHANGED) != 0) { - if (value != null && !value.equals(viewState.getCurrentValue())) { - // Always update the internal state. - viewState.setCurrentValue(value); - - // Must check if this update was caused by autofilling the view, in which - // case we just update the value, but not the UI. - final AutofillValue filledValue = viewState.getAutofilledValue(); - if (value.equals(filledValue)) { - return; - } - // Update the internal state... - viewState.setState(ViewState.STATE_CHANGED); - - //..and the UI - if (value.isText()) { - getUiForShowing().filterFillUi(value.getTextValue().toString()); - } else { - getUiForShowing().filterFillUi(null); + switch(action) { + case ACTION_START_SESSION: + // View is triggering autofill. + mCurrentViewId = viewState.id; + viewState.update(value, virtualBounds); + viewState.setState(ViewState.STATE_STARTED_SESSION); + requestNewFillResponseLocked(flags); + break; + case ACTION_VALUE_CHANGED: + if (value != null && !value.equals(viewState.getCurrentValue())) { + // Always update the internal state. + viewState.setCurrentValue(value); + + // Must check if this update was caused by autofilling the view, in which + // case we just update the value, but not the UI. + final AutofillValue filledValue = viewState.getAutofilledValue(); + if (value.equals(filledValue)) { + return; + } + // Update the internal state... + viewState.setState(ViewState.STATE_CHANGED); + + //..and the UI + if (value.isText()) { + getUiForShowing().filterFillUi(value.getTextValue().toString()); + } else { + getUiForShowing().filterFillUi(null); + } } - } - - return; - } - - if ((flags & FLAG_VIEW_ENTERED) != 0) { - if (shouldStartNewPartitionLocked(id)) { - // TODO(b/37424539): proper implementation - if (mResponseWaitingAuth != null && ((flags & FLAG_START_SESSION) == 0)) { - viewState.setState(ViewState.STATE_WAITING_RESPONSE_AUTH); - } else if ((flags & FLAG_START_SESSION) == 0){ - if (DEBUG) { - Slog.d(TAG, "Starting partition for view id " + viewState.id); + break; + case ACTION_VIEW_ENTERED: + if (shouldStartNewPartitionLocked(id)) { + // TODO(b/37424539): proper implementation + if (mResponseWaitingAuth != null) { + viewState.setState(ViewState.STATE_WAITING_RESPONSE_AUTH); + } else { + if (DEBUG) { + Slog.d(TAG, "Starting partition for view id " + viewState.id); + } + viewState.setState(ViewState.STATE_STARTED_PARTITION); + requestNewFillResponseLocked(flags); } - viewState.setState(ViewState.STATE_STARTED_PARTITION); - requestNewFillResponseLocked(); } - } - - // Remove the UI if the ViewState has changed. - if (mCurrentViewId != viewState.id) { - mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null); - mCurrentViewId = viewState.id; - } - // If the ViewState is ready to be displayed, onReady() will be called. - viewState.update(value, virtualBounds); - - return; - } + // Remove the UI if the ViewState has changed. + if (mCurrentViewId != viewState.id) { + mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null); + mCurrentViewId = viewState.id; + } - if ((flags & FLAG_VIEW_EXITED) != 0) { - if (mCurrentViewId == viewState.id) { - mUi.hideFillUi(viewState.id); - mCurrentViewId = null; - } - return; + // If the ViewState is ready to be displayed, onReady() will be called. + viewState.update(value, virtualBounds); + break; + case ACTION_VIEW_EXITED: + if (mCurrentViewId == viewState.id) { + mUi.hideFillUi(viewState.id); + mCurrentViewId = null; + } + break; + default: + Slog.w(TAG, "updateLocked(): unknown action: " + action); } - - Slog.w(TAG, "updateLocked(): unknown flags " + flags + ": " + getFlagAsString(flags)); } @Override @@ -1042,7 +1031,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onFillReady() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -1055,12 +1044,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState getUiForShowing().showFillUi(filledId, response, filterText, mPackageName); } - static String getFlagAsString(int flag) { - return DebugUtils.flagsToString(AutofillManager.class, "FLAG_", flag); - } - - int getId() { - return mId; + String getActionAsString(int flag) { + return DebugUtils.flagsToString(AutofillManager.class, "ACTION_", flag); } boolean isDestroyed() { @@ -1079,7 +1064,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (!mHasCallback) return; try { - mClient.notifyNoFillUi(mId, mWindowToken, mCurrentViewId); + mClient.notifyNoFillUi(id, mWindowToken, mCurrentViewId); } catch (RemoteException e) { Slog.e(TAG, "Error notifying client no fill UI: windowToken=" + mWindowToken + " id=" + mCurrentViewId, e); @@ -1114,7 +1099,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } try { - mClient.setTrackedViews(mId, trackedViews, saveOnAllViewsInvisible); + mClient.setTrackedViews(id, trackedViews, saveOnAllViewsInvisible); } catch (RemoteException e) { Slog.w(TAG, "Cannot set tracked ids", e); } @@ -1128,7 +1113,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (mResponses == null) { mResponses = new SparseArray<>(4); } - mResponses.put(response.getRequestId(), response); + final int requestId = response.getRequestId(); + mResponses.put(requestId, response); mClientState = response.getClientState(); setViewStatesLocked(response, ViewState.STATE_FILLABLE); @@ -1138,13 +1124,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return; } - if ((mFlags & FLAG_MANUAL_REQUEST) != 0 && response.getDatasets() != null - && response.getDatasets().size() == 1) { - Slog.d(TAG, "autofilling manual request directly"); - autoFill(response.getRequestId(), response.getDatasets().get(0)); - return; - } + final ArrayList<Dataset> datasets = response.getDatasets(); + if (datasets != null && datasets.size() == 1) { + // Check if it its a single response for a manual request, in which case it should + // be automatically filled + final FillContext context = getFillContextByRequestIdLocked(requestId); + if (context != null && (context.getStructure().getFlags() & FLAG_MANUAL_REQUEST) != 0) { + Slog.d(TAG, "autofilling manual request directly"); + autoFill(requestId, datasets.get(0)); + return; + } + } // Updates the UI, if necessary. final ViewState currentView = mViewStates.get(mCurrentViewId); currentView.maybeCallOnFillReady(); @@ -1199,7 +1190,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - private ViewState createOrUpdateViewStateLocked(AutofillId id, int state,AutofillValue value) { + private ViewState createOrUpdateViewStateLocked(AutofillId id, int state, AutofillValue value) { ViewState viewState = mViewStates.get(id); if (viewState != null) { viewState.setState(state); @@ -1234,7 +1225,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#autoFill() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } // Autofill it directly... @@ -1280,7 +1271,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private void startAuthentication(IntentSender intent, Intent fillInIntent) { try { synchronized (mLock) { - mClient.authenticate(mId, intent, fillInIntent); + mClient.authenticate(id, intent, fillInIntent); } } catch (RemoteException e) { Slog.e(TAG, "Error launching auth intent", e); @@ -1288,10 +1279,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } void dumpLocked(String prefix, PrintWriter pw) { - pw.print(prefix); pw.print("id: "); pw.println(mId); + pw.print(prefix); pw.print("id: "); pw.println(id); pw.print(prefix); pw.print("uid: "); pw.println(uid); pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken); - pw.print(prefix); pw.print("mFlags: "); pw.println(mFlags); pw.print(prefix); pw.print("mResponses: "); pw.println(mResponses); pw.print(prefix); pw.print("mResponseWaitingAuth: "); pw.println(mResponseWaitingAuth); pw.print(prefix); pw.print("mDatasetWaitingAuth: "); pw.println(mDatasetWaitingAuth); @@ -1332,14 +1322,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#autoFillApp() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } try { if (DEBUG) { Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset); } - mClient.autofill(mId, mWindowToken, dataset.getFieldIds(), + mClient.autofill(id, mWindowToken, dataset.getFieldIds(), dataset.getFieldValues()); setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED); } catch (RemoteException e) { @@ -1378,11 +1368,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } if (mDestroyed) { Slog.w(TAG, "Call to Session#removeSelfLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } destroyLocked(); - mService.removeSessionLocked(mId); + mService.removeSessionLocked(id); } private int getLastResponseIndex() { diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java index 3967f59355c4..d98ee9d0c8bf 100644 --- a/services/autofill/java/com/android/server/autofill/ViewState.java +++ b/services/autofill/java/com/android/server/autofill/ViewState.java @@ -65,15 +65,15 @@ final class ViewState { public static final int STATE_WAITING_RESPONSE_AUTH = 0x80; public final AutofillId id; + private final Listener mListener; private final Session mSession; - private FillResponse mResponse; + private FillResponse mResponse; private AutofillValue mInitialValue; private AutofillValue mCurrentValue; private AutofillValue mAutofilledValue; private Rect mVirtualBounds; - private int mState; ViewState(Session session, AutofillId id, AutofillValue value, Listener listener, int state) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 772cdcd2f25b..cabaebd43e46 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -12912,11 +12912,6 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean requestAutofillData(IResultReceiver receiver, Bundle receiverExtras, IBinder activityToken, int flags) { - // NOTE: we could always use ActivityManager.ASSIST_CONTEXT_FULL and let ActivityThread - // rely on the flags to decide whether the handleRequestAssistContextExtras() is for - // autofill, but it's safer to explicitly use new AutoFill types, in case the Assist - // requests use flags in the future as well (since their flags value might collide with the - // autofill flag values). return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null, receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(), null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null; |