From 2106506181d403bda139c473c812f9836fe0ce53 Mon Sep 17 00:00:00 2001 From: Adam He Date: Wed, 26 Feb 2020 12:34:50 -0800 Subject: [PATCH] Allow disojoint datasets for inline suggestions. Autofill providers are allowed to pass back datasets that do not always contain data for all views present. Inline response will ignore datasets not relevant to currently focused AutofillId or those without an InlinePresentation. Fixes: 150312101 Test: atest InlineLoginActivityTest Change-Id: Ie4d48eec571d4ccbfcbff8aa3ad4a75f7716072c --- .../RemoteAugmentedAutofillService.java | 34 ++++++++++++------- .../com/android/server/autofill/Session.java | 6 ++++ .../autofill/ui/InlineSuggestionFactory.java | 4 +-- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java index 1eb769216e632..228c6286a0f06 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java @@ -47,6 +47,7 @@ import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; import android.view.inputmethod.InlineSuggestionsRequest; +import android.view.inputmethod.InlineSuggestionsResponse; import com.android.internal.infra.AbstractRemoteService; import com.android.internal.infra.AndroidFuture; @@ -243,20 +244,27 @@ final class RemoteAugmentedAutofillService } mCallbacks.setLastResponse(sessionId); + final InlineSuggestionsResponse inlineSuggestionsResponse = + InlineSuggestionFactory.createAugmentedInlineSuggestionsResponse( + request, inlineSuggestionsData, focusedId, mContext, + dataset -> { + mCallbacks.logAugmentedAutofillSelected(sessionId, + dataset.getId()); + try { + client.autofill(sessionId, dataset.getFieldIds(), + dataset.getFieldValues()); + } catch (RemoteException e) { + Slog.w(TAG, "Encounter exception autofilling the values"); + } + }, onErrorCallback, remoteRenderService); + + if (inlineSuggestionsResponse == null) { + Slog.w(TAG, "InlineSuggestionFactory created null response"); + return; + } + try { - inlineSuggestionsCallback.onInlineSuggestionsResponse( - InlineSuggestionFactory.createAugmentedInlineSuggestionsResponse( - request, inlineSuggestionsData, focusedId, mContext, - dataset -> { - mCallbacks.logAugmentedAutofillSelected(sessionId, - dataset.getId()); - try { - client.autofill(sessionId, dataset.getFieldIds(), - dataset.getFieldValues()); - } catch (RemoteException e) { - Slog.w(TAG, "Encounter exception autofilling the values"); - } - }, onErrorCallback, remoteRenderService)); + inlineSuggestionsCallback.onInlineSuggestionsResponse(inlineSuggestionsResponse); } catch (RemoteException e) { Slog.w(TAG, "Exception sending inline suggestions response back to IME."); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 317ce4cb5feea..960997dd7df88 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -2686,6 +2686,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState requestHideFillUi(mCurrentViewId); } }, mService.getRemoteInlineSuggestionRenderServiceLocked()); + + if (inlineSuggestionsResponse == null) { + Slog.w(TAG, "InlineSuggestionFactory created null response"); + return false; + } + try { imeResponse.getCallback().onInlineSuggestionsResponse(inlineSuggestionsResponse); } catch (RemoteException e) { diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java index fef49d44bed06..91ae89eb33875 100644 --- a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java +++ b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java @@ -150,13 +150,13 @@ public final class InlineSuggestionFactory { final int fieldIndex = dataset.getFieldIds().indexOf(autofillId); if (fieldIndex < 0) { Slog.w(TAG, "AutofillId=" + autofillId + " not found in dataset"); - return null; + continue; } final InlinePresentation inlinePresentation = dataset.getFieldInlinePresentation( fieldIndex); if (inlinePresentation == null) { Slog.w(TAG, "InlinePresentation not found in dataset"); - return null; + continue; } if (!includeDataset(dataset, fieldIndex, filterText)) { continue;