diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java index 1c32fe03ca7ef..3a84224084c02 100644 --- a/core/java/android/service/autofill/FillRequest.java +++ b/core/java/android/service/autofill/FillRequest.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Bundle; -import android.os.CancellationSignal; import android.os.Parcel; import android.os.Parcelable; import android.view.View; @@ -38,7 +37,7 @@ import java.util.List; * interesting for saving and what are the possible ways to fill the inputs on * the screen if applicable. * - * @see AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback) + * @see AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback) */ public final class FillRequest implements Parcelable { @@ -122,9 +121,14 @@ public final class FillRequest implements Parcelable { return mContexts; } + @Override + public String toString() { + return "FillRequest: [id=" + mId + ", flags=" + mFlags + ", ctxts= " + mContexts + "]"; + } + /** * Gets the extra client state returned from the last {@link - * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback) + * AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback) * fill request}, so the service can use it for state management. * *

Once a {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback) diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index dd980535f628d..f315148547e96 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -387,8 +387,10 @@ final class RemoteFillService implements DeathRecipient { @Override public void executeMessage(Message message) { if (mDestroyed) { - Slog.w(LOG_TAG, "Not handling " + message + " as service for " - + mComponentName + " is already destroyed"); + if (sVerbose) { + Slog.v(LOG_TAG, "Not handling " + message + " as service for " + + mComponentName + " is already destroyed"); + } return; } switch (message.what) { @@ -574,6 +576,13 @@ final class RemoteFillService implements DeathRecipient { @Override public void run() { + synchronized (mLock) { + if (isCancelledLocked()) { + // TODO(b/653742740): we should probably return here, but for now we're justing + // logging to confirm this is the problem if it happens again. + Slog.e(LOG_TAG, "run() called after canceled: " + mRequest); + } + } final RemoteFillService remoteService = getService(); if (remoteService != null) { try { diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index d81cd646d8cd9..c6079669da2c8 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -268,7 +268,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState value = state.getCurrentValue(); if (value == null) { if (sDebug) Slog.d(TAG, "getValue(): no current value for " + id); - value = getValueFromContexts(id); + value = getValueFromContextsLocked(id); } } if (value != null) { @@ -276,7 +276,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return value.getTextValue().toString(); } if (value.isList()) { - final CharSequence[] options = getAutofillOptionsFromContexts(id); + final CharSequence[] options = getAutofillOptionsFromContextsLocked(id); if (options != null) { final int index = value.getListValue(); final CharSequence option = options[index]; @@ -339,21 +339,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Cancels the last request sent to the {@link #mRemoteFillService}. */ private void cancelCurrentRequestLocked() { - int canceledRequest = mRemoteFillService.cancelCurrentRequest(); + final int canceledRequest = mRemoteFillService.cancelCurrentRequest(); // Remove the FillContext as there will never be a response for the service if (canceledRequest != INVALID_REQUEST_ID && mContexts != null) { - int numContexts = mContexts.size(); + final int numContexts = mContexts.size(); // It is most likely the last context, hence search backwards for (int i = numContexts - 1; i >= 0; i--) { if (mContexts.get(i).getRequestId() == canceledRequest) { + if (sDebug) Slog.d(TAG, "cancelCurrentRequest(): id = " + canceledRequest); mContexts.remove(i); break; } } } - } /** @@ -579,17 +579,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState public void authenticate(int requestId, int datasetIndex, IntentSender intent, Bundle extras) { final Intent fillInIntent; synchronized (mLock) { - synchronized (mLock) { - if (mDestroyed) { - Slog.w(TAG, "Call to Session#authenticate() rejected - session: " - + id + " destroyed"); - return; - } + if (mDestroyed) { + Slog.w(TAG, "Call to Session#authenticate() rejected - session: " + + id + " destroyed"); + return; } - fillInIntent = createAuthFillInIntent( - getFillContextByRequestIdLocked(requestId).getStructure(), extras); + fillInIntent = createAuthFillInIntentLocked(requestId, extras); } - mService.setAuthenticationSelected(id); final int authenticationId = AutofillManager.makeAuthenticationId(requestId, datasetIndex); @@ -846,7 +842,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState AutofillValue value = viewState.getCurrentValue(); if (value == null || value.isEmpty()) { - final AutofillValue initialValue = getValueFromContexts(id); + final AutofillValue initialValue = getValueFromContextsLocked(id); if (initialValue != null) { if (sDebug) { Slog.d(TAG, "Value of required field " + id + " didn't change; " @@ -900,7 +896,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } else { // Update current values cache based on initial value - final AutofillValue initialValue = getValueFromContexts(id); + final AutofillValue initialValue = getValueFromContextsLocked(id); if (sDebug) { Slog.d(TAG, "no current value for " + id + "; initial value is " + initialValue); @@ -1007,7 +1003,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Gets the latest non-empty value for the given id in the autofill contexts. */ @Nullable - private AutofillValue getValueFromContexts(AutofillId id) { + private AutofillValue getValueFromContextsLocked(AutofillId id) { final int numContexts = mContexts.size(); for (int i = numContexts - 1; i >= 0; i--) { final FillContext context = mContexts.get(i); @@ -1029,7 +1025,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * Gets the latest autofill options for the given id in the autofill contexts. */ @Nullable - private CharSequence[] getAutofillOptionsFromContexts(AutofillId id) { + private CharSequence[] getAutofillOptionsFromContextsLocked(AutofillId id) { final int numContexts = mContexts.size(); for (int i = numContexts - 1; i >= 0; i--) { @@ -1054,6 +1050,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (sVerbose) Slog.v(TAG, "callSaveLocked(): mViewStates=" + mViewStates); + if (mContexts == null) { + Slog.w(TAG, "callSaveLocked(): no contexts"); + return; + } + final int numContexts = mContexts.size(); for (int contextNum = 0; contextNum < numContexts; contextNum++) { @@ -1553,8 +1554,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // ...or handle authentication. mService.setDatasetAuthenticationSelected(dataset.getId(), id); setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false); - final Intent fillInIntent = createAuthFillInIntent( - getFillContextByRequestIdLocked(requestId).getStructure(), mClientState); + final Intent fillInIntent = createAuthFillInIntentLocked(requestId, mClientState); final int authenticationId = AutofillManager.makeAuthenticationId(requestId, datasetIndex); @@ -1568,9 +1568,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - private Intent createAuthFillInIntent(AssistStructure structure, Bundle extras) { + private Intent createAuthFillInIntentLocked(int requestId, Bundle extras) { final Intent fillInIntent = new Intent(); - fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, structure); + + final FillContext context = getFillContextByRequestIdLocked(requestId); + if (context == null) { + // TODO(b/653742740): this will crash system_server. We need to handle it, but we're + // keeping it crashing for now so we can diagnose when it happens again + Slog.wtf(TAG, "no FillContext for requestId" + requestId + "; mContexts= " + mContexts); + } + fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, context.getStructure()); fillInIntent.putExtra(AutofillManager.EXTRA_CLIENT_STATE, extras); return fillInIntent; }