diff options
author | Justin Klaassen <justinklaassen@google.com> | 2017-11-17 16:38:15 -0500 |
---|---|---|
committer | Justin Klaassen <justinklaassen@google.com> | 2017-11-17 16:38:15 -0500 |
commit | 6a65f2da209bff03cb0eb6da309710ac6ee5026d (patch) | |
tree | 48e2090e716d4178378cb0599fc5d9cffbcf3f63 /com/android/server/autofill/Session.java | |
parent | 46c77c203439b3b37c99d09e326df4b1fe08c10b (diff) | |
download | android-28-6a65f2da209bff03cb0eb6da309710ac6ee5026d.tar.gz |
Import Android SDK Platform P [4456821]
/google/data/ro/projects/android/fetch_artifact \
--bid 4456821 \
--target sdk_phone_armv7-win_sdk \
sdk-repo-linux-sources-4456821.zip
AndroidVersion.ApiLevel has been modified to appear as 28
Change-Id: I2d206b200d7952f899a5d1647ab532638cc8dd43
Diffstat (limited to 'com/android/server/autofill/Session.java')
-rw-r--r-- | com/android/server/autofill/Session.java | 179 |
1 files changed, 119 insertions, 60 deletions
diff --git a/com/android/server/autofill/Session.java b/com/android/server/autofill/Session.java index 010995f2..af4668a6 100644 --- a/com/android/server/autofill/Session.java +++ b/com/android/server/autofill/Session.java @@ -16,10 +16,10 @@ package com.android.server.autofill; +import static android.app.ActivityManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS; +import static android.app.ActivityManagerInternal.ASSIST_KEY_STRUCTURE; 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.ACTION_START_SESSION; import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED; import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED; @@ -36,6 +36,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; +import android.app.IAssistDataReceiver; import android.app.assist.AssistStructure; import android.app.assist.AssistStructure.AutofillOverlay; import android.app.assist.AssistStructure.ViewNode; @@ -43,6 +44,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.graphics.Bitmap; import android.graphics.Rect; import android.metrics.LogMaker; import android.os.Binder; @@ -53,6 +55,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.service.autofill.AutofillService; import android.service.autofill.Dataset; +import android.service.autofill.FieldsDetection; import android.service.autofill.FillContext; import android.service.autofill.FillRequest; import android.service.autofill.FillResponse; @@ -78,7 +81,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.HandlerCaller; -import com.android.internal.os.IResultReceiver; import com.android.internal.util.ArrayUtils; import com.android.server.autofill.ui.AutoFillUI; import com.android.server.autofill.ui.PendingUi; @@ -203,16 +205,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** * Receiver of assist data from the app's {@link Activity}. */ - private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() { + private final IAssistDataReceiver mAssistReceiver = new IAssistDataReceiver.Stub() { @Override - public void send(int resultCode, Bundle resultData) throws RemoteException { - final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE); + public void onHandleAssistData(Bundle resultData) throws RemoteException { + final AssistStructure structure = resultData.getParcelable(ASSIST_KEY_STRUCTURE); if (structure == null) { Slog.e(TAG, "No assist structure - app might have crashed providing it"); return; } - final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS); + final Bundle receiverExtras = resultData.getBundle(ASSIST_KEY_RECEIVER_EXTRAS); if (receiverExtras == null) { Slog.e(TAG, "No receiver extras - app might have crashed providing it"); return; @@ -261,6 +263,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mRemoteFillService.onFillRequest(request); } + + @Override + public void onHandleAssistScreenshot(Bitmap screenshot) { + // Do nothing + } }; /** @@ -486,6 +493,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + // TODO(b/67867469): remove once feature is finished + if (response.getFieldsDetection() != null && !mService.isFieldDetectionEnabled()) { + Slog.w(TAG, "Ignoring " + response + " because field detection is disabled"); + processNullResponseLocked(requestFlags); + return; + } + mService.setLastResponse(serviceUid, id, response); int sessionFinishedState = 0; @@ -907,11 +921,29 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } } - if (!hasAtLeastOneDataset) { - if (sVerbose) Slog.v(TAG, "logContextCommittedLocked(): skipped (no datasets)"); + final FieldsDetection fieldsDetection = lastResponse.getFieldsDetection(); + + if (!hasAtLeastOneDataset && fieldsDetection == null) { + if (sVerbose) { + Slog.v(TAG, "logContextCommittedLocked(): skipped (no datasets nor fields " + + "detection)"); + } return; } + final AutofillId detectableFieldId; + final String detectableRemoteId; + String detectedRemoteId = null; + if (fieldsDetection == null) { + detectableFieldId = null; + detectableRemoteId = null; + } else { + detectableFieldId = fieldsDetection.getFieldId(); + detectableRemoteId = fieldsDetection.getRemoteId(); + } + + int detectedFieldScore = -1; + for (int i = 0; i < mViewStates.size(); i++) { final ViewState viewState = mViewStates.valueAt(i); final int state = viewState.getState(); @@ -920,7 +952,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // - autofilled -> changedDatasetIds // - not autofilled but matches a dataset value -> manuallyFilledIds if ((state & ViewState.STATE_CHANGED) != 0) { - // Check if autofilled value was changed if ((state & ViewState.STATE_AUTOFILLED) != 0) { final String datasetId = viewState.getDatasetId(); @@ -952,7 +983,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState changedFieldIds.add(viewState.id); changedDatasetIds.add(datasetId); } else { - // Check if value match a dataset. final AutofillValue currentValue = viewState.getCurrentValue(); if (currentValue == null) { if (sDebug) { @@ -961,58 +991,78 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } continue; } - for (int j = 0; j < responseCount; j++) { - final FillResponse response = mResponses.valueAt(j); - final List<Dataset> datasets = response.getDatasets(); - if (datasets == null || datasets.isEmpty()) { - if (sVerbose) Slog.v(TAG, "logContextCommitted() no datasets at " + j); - } else { - for (int k = 0; k < datasets.size(); k++) { - final Dataset dataset = datasets.get(k); - final String datasetId = dataset.getId(); - if (datasetId == null) { - if (sVerbose) { - Slog.v(TAG, "logContextCommitted() skipping idless dataset " - + dataset); - } - } else { - final ArrayList<AutofillValue> values = dataset.getFieldValues(); - for (int l = 0; l < values.size(); l++) { - final AutofillValue candidate = values.get(l); - if (currentValue.equals(candidate)) { - if (sDebug) { - Slog.d(TAG, "field " + viewState.id - + " was manually filled with value set by " - + "dataset " + datasetId); + // Check if value match a dataset. + if (hasAtLeastOneDataset) { + for (int j = 0; j < responseCount; j++) { + final FillResponse response = mResponses.valueAt(j); + final List<Dataset> datasets = response.getDatasets(); + if (datasets == null || datasets.isEmpty()) { + if (sVerbose) { + Slog.v(TAG, "logContextCommitted() no datasets at " + j); + } + } else { + for (int k = 0; k < datasets.size(); k++) { + final Dataset dataset = datasets.get(k); + final String datasetId = dataset.getId(); + if (datasetId == null) { + if (sVerbose) { + Slog.v(TAG, "logContextCommitted() skipping idless " + + "dataset " + dataset); + } + } else { + final ArrayList<AutofillValue> values = + dataset.getFieldValues(); + for (int l = 0; l < values.size(); l++) { + final AutofillValue candidate = values.get(l); + if (currentValue.equals(candidate)) { + if (sDebug) { + Slog.d(TAG, "field " + viewState.id + " was " + + "manually filled with value set by " + + "dataset " + datasetId); + } + if (manuallyFilledIds == null) { + manuallyFilledIds = new ArrayMap<>(); + } + ArraySet<String> datasetIds = + manuallyFilledIds.get(viewState.id); + if (datasetIds == null) { + datasetIds = new ArraySet<>(1); + manuallyFilledIds.put(viewState.id, datasetIds); + } + datasetIds.add(datasetId); } - if (manuallyFilledIds == null) { - manuallyFilledIds = new ArrayMap<>(); + } // for l + if (mSelectedDatasetIds == null + || !mSelectedDatasetIds.contains(datasetId)) { + if (sVerbose) { + Slog.v(TAG, "adding ignored dataset " + datasetId); } - ArraySet<String> datasetIds = - manuallyFilledIds.get(viewState.id); - if (datasetIds == null) { - datasetIds = new ArraySet<>(1); - manuallyFilledIds.put(viewState.id, datasetIds); + if (ignoredDatasets == null) { + ignoredDatasets = new ArraySet<>(); } - datasetIds.add(datasetId); - } - } - if (mSelectedDatasetIds == null - || !mSelectedDatasetIds.contains(datasetId)) { - if (sVerbose) { - Slog.v(TAG, "adding ignored dataset " + datasetId); - } - if (ignoredDatasets == null) { - ignoredDatasets = new ArraySet<>(); - } - ignoredDatasets.add(datasetId); - } - } - } + ignoredDatasets.add(datasetId); + } // if + } // if + } // for k + } // else + } // for j + } + + // Check if detectable field changed. + if (detectableFieldId != null && detectableFieldId.equals(viewState.id) + && currentValue.isText() && currentValue.getTextValue() != null) { + final String actualValue = currentValue.getTextValue().toString(); + final String expectedValue = fieldsDetection.getValue(); + if (actualValue.equalsIgnoreCase(expectedValue)) { + detectedRemoteId = detectableRemoteId; + detectedFieldScore = 0; + } else if (sVerbose) { + Slog.v(TAG, "Detection mismatch for field " + detectableFieldId); } + // TODO(b/67867469): set score on partial hits } - } - } + } // else + } // else } if (sVerbose) { @@ -1021,7 +1071,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState + ", ignoredDatasetIds=" + ignoredDatasets + ", changedAutofillIds=" + changedFieldIds + ", changedDatasetIds=" + changedDatasetIds - + ", manuallyFilledIds=" + manuallyFilledIds); + + ", manuallyFilledIds=" + manuallyFilledIds + + ", detectableFieldId=" + detectableFieldId + + ", detectedFieldScore=" + detectedFieldScore + ); } ArrayList<AutofillId> manuallyFilledFieldIds = null; @@ -1039,9 +1092,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState manuallyFilledDatasetIds.add(new ArrayList<>(datasetIds)); } } + mService.logContextCommitted(id, mClientState, mSelectedDatasetIds, ignoredDatasets, changedFieldIds, changedDatasetIds, - manuallyFilledFieldIds, manuallyFilledDatasetIds); + manuallyFilledFieldIds, manuallyFilledDatasetIds, + detectedRemoteId, detectedFieldScore); } /** @@ -1529,6 +1584,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState viewState = new ViewState(this, id, this, isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL); mViewStates.put(id, viewState); + + // TODO(b/67867469): for optimization purposes, should also ignore if change is + // detectable, and batch-send them when the session is finished (but that will + // require tracking detectable fields on AutofillManager) if (isIgnored) { if (sDebug) Slog.d(TAG, "updateLocked(): ignoring view " + id); return; |