Merge "Fixed autofill workflow to handle manual requests after session became for augmented autofill only." into qt-dev

This commit is contained in:
Felipe Leme
2019-05-09 00:18:56 +00:00
committed by Android (Google) Code Review
3 changed files with 53 additions and 10 deletions

View File

@@ -48,6 +48,7 @@ import android.service.autofill.FillEventHistory;
import android.service.autofill.UserData;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.DebugUtils;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
@@ -229,7 +230,8 @@ public final class AutofillManager {
/** @hide */ public static final int FLAG_ADD_CLIENT_VERBOSE = 0x4;
/** @hide */ public static final int FLAG_ADD_CLIENT_ENABLED_FOR_AUGMENTED_AUTOFILL_ONLY = 0x8;
/** @hide */ public static final int FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY = 0x1;
// NOTE: flag below is used by the session start receiver only, hence it can have values above
/** @hide */ public static final int RECEIVER_FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY = 0x1;
/** @hide */
public static final int DEFAULT_LOGGING_LEVEL = Build.IS_DEBUGGABLE
@@ -521,7 +523,7 @@ public final class AutofillManager {
private boolean mForAugmentedAutofillOnly;
/**
* When set, standard autofill is enabled, but sessions can still be created for augmented
* When set, standard autofill is disabled, but sessions can still be created for augmented
* autofill only.
*/
@GuardedBy("mLock")
@@ -969,6 +971,13 @@ public final class AutofillManager {
startSessionLocked(id, null, value, flags);
} else {
// Update focus on existing session.
if (mForAugmentedAutofillOnly && (flags & FLAG_MANUAL_REQUEST) != 0) {
if (sDebug) {
Log.d(TAG, "notifyViewEntered(" + id + "): resetting "
+ "mForAugmentedAutofillOnly on manual request");
}
mForAugmentedAutofillOnly = false;
}
updateSessionLocked(id, null, value, ACTION_VIEW_ENTERED, flags);
}
addEnteredIdLocked(id);
@@ -1126,6 +1135,13 @@ public final class AutofillManager {
startSessionLocked(id, bounds, null, flags);
} else {
// Update focus on existing session.
if (mForAugmentedAutofillOnly && (flags & FLAG_MANUAL_REQUEST) != 0) {
if (sDebug) {
Log.d(TAG, "notifyViewEntered(" + id + "): resetting "
+ "mForAugmentedAutofillOnly on manual request");
}
mForAugmentedAutofillOnly = false;
}
updateSessionLocked(id, bounds, null, ACTION_VIEW_ENTERED, flags);
}
addEnteredIdLocked(id);
@@ -1695,6 +1711,16 @@ public final class AutofillManager {
+ ", enabledAugmentedOnly=" + mEnabledForAugmentedAutofillOnly
+ ", enteredIds=" + mEnteredIds);
}
// We need to reset the augmented-only state when a manual request is made, as it's possible
// that the service returned null for the first request and now the user is manually
// requesting autofill to trigger a custom UI provided by the service.
if (mForAugmentedAutofillOnly && !mEnabledForAugmentedAutofillOnly
&& (flags & FLAG_MANUAL_REQUEST) != 0) {
if (sVerbose) {
Log.v(TAG, "resetting mForAugmentedAutofillOnly on manual autofill request");
}
mForAugmentedAutofillOnly = false;
}
if (mState != STATE_UNKNOWN && !isFinishedLocked() && (flags & FLAG_MANUAL_REQUEST) == 0) {
if (sVerbose) {
Log.v(TAG, "not automatically starting session for " + id
@@ -1717,7 +1743,7 @@ public final class AutofillManager {
mState = STATE_ACTIVE;
}
final int extraFlags = receiver.getOptionalExtraIntResult(0);
if ((extraFlags & FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY) != 0) {
if ((extraFlags & RECEIVER_FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY) != 0) {
if (sDebug) Log.d(TAG, "startSession(" + componentName + "): for augmented only");
mForAugmentedAutofillOnly = true;
}
@@ -2011,10 +2037,20 @@ public final class AutofillManager {
public static final int SET_STATE_FLAG_DEBUG = 0x08;
/** @hide */
public static final int SET_STATE_FLAG_VERBOSE = 0x10;
/** @hide */
public static final int SET_STATE_FLAG_FOR_AUTOFILL_ONLY = 0x20;
private void setState(int flags) {
if (sVerbose) Log.v(TAG, "setState(" + flags + ")");
if (sVerbose) {
Log.v(TAG, "setState(" + flags + ": " + DebugUtils.flagsToString(AutofillManager.class,
"SET_STATE_FLAG_", flags) + ")");
}
synchronized (mLock) {
if ((flags & SET_STATE_FLAG_FOR_AUTOFILL_ONLY) != 0) {
mForAugmentedAutofillOnly = true;
// NOTE: returning right away as this is the only flag set, at least currently...
return;
}
mEnabled = (flags & SET_STATE_FLAG_ENABLED) != 0;
if (!mEnabled || (flags & SET_STATE_FLAG_RESET_SESSION) != 0) {
// Reset the session state
@@ -2390,7 +2426,7 @@ public final class AutofillManager {
}
}
if (sessionFinishedState != 0) {
if (sessionFinishedState != STATE_UNKNOWN) {
// Callback call was "hijacked" to also update the session state.
setSessionFinished(sessionFinishedState, /* autofillableIds= */ null);
}

View File

@@ -20,8 +20,8 @@ import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
import static android.view.autofill.AutofillManager.FLAG_ADD_CLIENT_ENABLED;
import static android.view.autofill.AutofillManager.FLAG_ADD_CLIENT_ENABLED_FOR_AUGMENTED_AUTOFILL_ONLY;
import static android.view.autofill.AutofillManager.FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY;
import static android.view.autofill.AutofillManager.NO_SESSION;
import static android.view.autofill.AutofillManager.RECEIVER_FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
@@ -283,7 +283,7 @@ final class AutofillManagerServiceImpl
*
* @return {@code long} whose right-most 32 bits represent the session id (which is always
* non-negative), and the left-most contains extra flags (currently either {@code 0} or
* {@link AutofillManager#FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY}).
* {@link AutofillManager#RECEIVER_FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY}).
*/
@GuardedBy("mLock")
long startSessionLocked(@NonNull IBinder activityToken, int taskId, int uid,
@@ -357,7 +357,8 @@ final class AutofillManagerServiceImpl
if (forAugmentedAutofillOnly) {
// Must embed the flag in the response, at the high-end side of the long.
// (session is always positive, so we don't have to worry about the signal bit)
final long extraFlags = ((long) FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY) << 32;
final long extraFlags =
((long) RECEIVER_FLAG_SESSION_FOR_AUGMENTED_AUTOFILL_ONLY) << 32;
final long result = extraFlags | newSession.id;
return result;
} else {

View File

@@ -2407,7 +2407,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return;
}
if (mAugmentedAutofillableIds != null && mAugmentedAutofillableIds.contains(id)) {
if ((flags & FLAG_MANUAL_REQUEST) == 0 && mAugmentedAutofillableIds != null
&& mAugmentedAutofillableIds.contains(id)) {
// View was already reported when server could not handle a response, but it
// triggered augmented autofill
@@ -2538,7 +2539,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
try {
if (mHasCallback) {
mClient.notifyNoFillUi(id, mCurrentViewId, sessionFinishedState);
} else if (sessionFinishedState != 0) {
} else if (sessionFinishedState != AutofillManager.STATE_UNKNOWN) {
mClient.setSessionFinished(sessionFinishedState, autofillableIds);
}
} catch (RemoteException e) {
@@ -2693,6 +2694,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
+ "it can be augmented. AutofillableIds: " + autofillableIds);
}
mAugmentedAutofillableIds = autofillableIds;
try {
mClient.setState(AutofillManager.SET_STATE_FLAG_FOR_AUTOFILL_ONLY);
} catch (RemoteException e) {
Slog.e(TAG, "Error setting client to autofill-only", e);
}
}
}