Merge "Removed deprecated setAuthentication() method that didn't take ids." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-05-02 00:53:30 +00:00
committed by Android (Google) Code Review
4 changed files with 71 additions and 40 deletions

View File

@@ -30,6 +30,7 @@ import android.view.autofill.AutofillManager;
import android.widget.RemoteViews;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Response for a {@link
@@ -258,12 +259,17 @@ public final class FillResponse implements Parcelable {
* @param ids id of Views that when focused will display the authentication UI affordance.
*
* @return This builder.
* @throw {@link IllegalArgumentException} if {@code ids} is {@code null} or empty, or if
* neither {@code authentication} nor {@code presentation} is non-{@code null}.
*
* @see android.app.PendingIntent#getIntentSender()
*/
public @NonNull Builder setAuthentication(@NonNull AutofillId[] ids,
@Nullable IntentSender authentication, @Nullable RemoteViews presentation) {
throwIfDestroyed();
// TODO(b/37424539): assert ids is not null nor empty once old version is removed
if (ids == null || ids.length == 0) {
throw new IllegalArgumentException("ids cannot be null or empry");
}
if (authentication == null ^ presentation == null) {
throw new IllegalArgumentException("authentication and presentation"
+ " must be both non-null or null");
@@ -274,17 +280,6 @@ public final class FillResponse implements Parcelable {
return this;
}
/**
* TODO(b/37424539): will be removed once clients use the version that takes ids
* @hide
* @deprecated
*/
@Deprecated
public @NonNull Builder setAuthentication(@Nullable IntentSender authentication,
@Nullable RemoteViews presentation) {
return setAuthentication(null, authentication, presentation);
}
/**
* Specifies views that should not trigger new
* {@link AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal,
@@ -396,6 +391,7 @@ public final class FillResponse implements Parcelable {
public String toString() {
if (!sDebug) return super.toString();
// TODO: create a dump() method instead
return new StringBuilder(
"FillResponse : [mRequestId=" + mRequestId)
.append(", datasets=").append(mDatasets)
@@ -403,10 +399,8 @@ public final class FillResponse implements Parcelable {
.append(", clientState=").append(mClientState != null)
.append(", hasPresentation=").append(mPresentation != null)
.append(", hasAuthentication=").append(mAuthentication != null)
.append(", authenticationSize=").append(mAuthenticationIds != null
? mAuthenticationIds.length : "N/A")
.append(", ignoredIdsSize=").append(mIgnoredIds != null
? mIgnoredIds.length : "N/A")
.append(", authenticationIds=").append(Arrays.toString(mAuthenticationIds))
.append(", ignoredIds=").append(Arrays.toString(mIgnoredIds))
.append("]")
.toString();
}
@@ -447,8 +441,16 @@ public final class FillResponse implements Parcelable {
}
builder.setSaveInfo(parcel.readParcelable(null));
builder.setClientState(parcel.readParcelable(null));
builder.setAuthentication(parcel.readParcelableArray(null, AutofillId.class),
parcel.readParcelable(null), parcel.readParcelable(null));
// Sets authentication state.
final AutofillId[] authenticationIds = parcel.readParcelableArray(null,
AutofillId.class);
final IntentSender authentication = parcel.readParcelable(null);
final RemoteViews presentation = parcel.readParcelable(null);
if (authenticationIds != null) {
builder.setAuthentication(authenticationIds, authentication, presentation);
}
builder.setIgnoredIds(parcel.readParcelableArray(null, AutofillId.class));
final FillResponse response = builder.build();

View File

@@ -603,15 +603,12 @@ public final class AutofillManagerService extends SystemService {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
boolean oldDebug = sDebug;
boolean oldVerbose = sVerbose;
try {
synchronized (mLock) {
oldDebug = sDebug;
oldVerbose = sVerbose;
setDebugLocked(true);
setVerboseLocked(true);
pw.print("Debug mode: "); pw.println(oldDebug);
pw.print("Verbose mode: "); pw.println(oldVerbose);
pw.print("Verbose mode: "); pw.println(sVerbose);
pw.print("Disabled users: "); pw.println(mDisabledUsers);
final int size = mServicesCache.size();
pw.print("Cached services: ");
@@ -631,7 +628,6 @@ public final class AutofillManagerService extends SystemService {
mRequestsHistory.reverseDump(fd, pw, args);
} finally {
setDebugLocked(oldDebug);
setVerboseLocked(oldVerbose);
}
}

View File

@@ -922,6 +922,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
}
if (ArrayUtils.contains(response.getAuthenticationIds(), id)) {
return false;
}
}
return true;
@@ -943,8 +947,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.v(TAG,
"Creating viewState for " + id + " on " + getActionAsString(action));
}
viewState = new ViewState(this, id, value, this, ViewState.STATE_INITIAL);
boolean isIgnored = isIgnoredLocked(id);
viewState = new ViewState(this, id, value, this,
isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL);
mViewStates.put(id, viewState);
if (isIgnored) {
if (sDebug) Slog.d(TAG, "updateLocked(): ignoring view " + id);
return;
}
} else {
if (sVerbose) Slog.v(TAG, "Ignored " + getActionAsString(action) + " for " + id);
return;
@@ -983,16 +993,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
break;
case ACTION_VIEW_ENTERED:
if (shouldStartNewPartitionLocked(id)) {
// TODO(b/37424539): proper implementation
if (mResponseWaitingAuth != null) {
viewState.setState(ViewState.STATE_WAITING_RESPONSE_AUTH);
} else {
if (sDebug) {
Slog.d(TAG, "Starting partition for view id " + viewState.id);
}
viewState.setState(ViewState.STATE_STARTED_PARTITION);
requestNewFillResponseLocked(flags);
if (sDebug) {
Slog.d(TAG, "Starting partition for view id " + viewState.id);
}
viewState.setState(ViewState.STATE_STARTED_PARTITION);
requestNewFillResponseLocked(flags);
}
// Remove the UI if the ViewState has changed.
@@ -1015,6 +1020,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
/**
* Checks whether a view should be ignored.
*/
private boolean isIgnoredLocked(AutofillId id) {
if (mResponses == null || mResponses.size() == 0) {
return false;
}
// Always check the latest response only
final FillResponse response = mResponses.valueAt(mResponses.size() - 1);
return ArrayUtils.contains(response.getIgnoredIds(), id);
}
@Override
public void onFillReady(FillResponse response, AutofillId filledId,
@Nullable AutofillValue value) {
@@ -1149,18 +1166,24 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final SaveInfo saveInfo = response.getSaveInfo();
if (saveInfo != null) {
final AutofillId[] requiredIds = saveInfo.getRequiredIds();
for (int i = 0; i < requiredIds.length; i++) {
final AutofillId id = requiredIds[i];
for (AutofillId id : requiredIds) {
createOrUpdateViewStateLocked(id, state, null);
}
final AutofillId[] optionalIds = saveInfo.getOptionalIds();
if (optionalIds != null) {
for (int i = 0; i < optionalIds.length; i++) {
final AutofillId id = optionalIds[i];
for (AutofillId id : optionalIds) {
createOrUpdateViewStateLocked(id, state, null);
}
}
}
final AutofillId[] authIds = response.getAuthenticationIds();
if (authIds != null) {
for (AutofillId id : authIds) {
createOrUpdateViewStateLocked(id, state, null);
}
}
}
/**

View File

@@ -17,6 +17,7 @@
package com.android.server.autofill;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.Nullable;
import android.graphics.Rect;
@@ -61,8 +62,8 @@ final class ViewState {
public static final int STATE_STARTED_PARTITION = 0x20;
/** User select a dataset in this view, but service must authenticate first. */
public static final int STATE_WAITING_DATASET_AUTH = 0x40;
// TODO(b/37424539): temporary workaround until partitioning supports auth
public static final int STATE_WAITING_RESPONSE_AUTH = 0x80;
/** Service does not care about this view. */
public static final int STATE_IGNORED = 0x80;
public final AutofillId id;
@@ -199,7 +200,16 @@ final class ViewState {
void dump(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("id:" ); pw.println(this.id);
pw.print(prefix); pw.print("state:" ); pw.println(getStateAsString());
pw.print(prefix); pw.print("has response:" ); pw.println(mResponse != null);
pw.print(prefix); pw.print("response:");
if (mResponse == null) {
pw.println("N/A");
} else {
if (sVerbose) {
pw.println(mResponse);
} else {
pw.println(mResponse.getRequestId());
}
}
pw.print(prefix); pw.print("initialValue:" ); pw.println(mInitialValue);
pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
pw.print(prefix); pw.print("autofilledValue:" ); pw.println(mAutofilledValue);