Merge "Fixed autofill workflow to handle manual requests after session became for augmented autofill only." into qt-dev
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user