Merge "Handle autofill auth scenarios where the FillContext cannot be retrieved:" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
5488a38465
@@ -633,7 +633,7 @@ final class AutofillManagerServiceImpl {
|
||||
|
||||
void destroySessionsLocked() {
|
||||
if (mSessions.size() == 0) {
|
||||
mUi.destroyAll(null, null);
|
||||
mUi.destroyAll(null, null, false);
|
||||
return;
|
||||
}
|
||||
while (mSessions.size() > 0) {
|
||||
|
||||
@@ -578,9 +578,8 @@ final class RemoteFillService implements DeathRecipient {
|
||||
public void run() {
|
||||
synchronized (mLock) {
|
||||
if (isCancelledLocked()) {
|
||||
// TODO(b/653742740): we should probably return here, but for now we're justing
|
||||
// logging to confirm this is the problem if it happens again.
|
||||
Slog.e(LOG_TAG, "run() called after canceled: " + mRequest);
|
||||
if (sDebug) Slog.d(LOG_TAG, "run() called after canceled: " + mRequest);
|
||||
return;
|
||||
}
|
||||
}
|
||||
final RemoteFillService remoteService = getService();
|
||||
|
||||
@@ -566,6 +566,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
// FillServiceCallbacks
|
||||
@Override
|
||||
public void authenticate(int requestId, int datasetIndex, IntentSender intent, Bundle extras) {
|
||||
if (sDebug) {
|
||||
Slog.d(TAG, "authenticate(): requestId=" + requestId + "; datasetIdx=" + datasetIndex
|
||||
+ "; intentSender=" + intent);
|
||||
}
|
||||
final Intent fillInIntent;
|
||||
synchronized (mLock) {
|
||||
if (mDestroyed) {
|
||||
@@ -574,6 +578,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
return;
|
||||
}
|
||||
fillInIntent = createAuthFillInIntentLocked(requestId, extras);
|
||||
if (fillInIntent == null) {
|
||||
forceRemoveSelfLocked();
|
||||
return;
|
||||
}
|
||||
}
|
||||
mService.setAuthenticationSelected(id);
|
||||
|
||||
@@ -1568,6 +1576,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
|
||||
void autoFill(int requestId, int datasetIndex, Dataset dataset, boolean generateEvent) {
|
||||
if (sDebug) {
|
||||
Slog.d(TAG, "autoFill(): requestId=" + requestId + "; datasetIdx=" + datasetIndex
|
||||
+ "; dataset=" + dataset);
|
||||
}
|
||||
synchronized (mLock) {
|
||||
if (mDestroyed) {
|
||||
Slog.w(TAG, "Call to Session#autoFill() rejected - session: "
|
||||
@@ -1588,10 +1600,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
mService.logDatasetAuthenticationSelected(dataset.getId(), id);
|
||||
setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false);
|
||||
final Intent fillInIntent = createAuthFillInIntentLocked(requestId, mClientState);
|
||||
|
||||
if (fillInIntent == null) {
|
||||
forceRemoveSelfLocked();
|
||||
return;
|
||||
}
|
||||
final int authenticationId = AutofillManager.makeAuthenticationId(requestId,
|
||||
datasetIndex);
|
||||
startAuthentication(authenticationId, dataset.getAuthentication(), fillInIntent);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1601,14 +1617,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: this should never be null, but we got at least one occurrence, probably due to a race.
|
||||
@Nullable
|
||||
private Intent createAuthFillInIntentLocked(int requestId, Bundle extras) {
|
||||
final Intent fillInIntent = new Intent();
|
||||
|
||||
final FillContext context = getFillContextByRequestIdLocked(requestId);
|
||||
if (context == null) {
|
||||
// TODO(b/653742740): this will crash system_server. We need to handle it, but we're
|
||||
// keeping it crashing for now so we can diagnose when it happens again
|
||||
Slog.wtf(TAG, "no FillContext for requestId" + requestId + "; mContexts= " + mContexts);
|
||||
Slog.wtf(TAG, "createAuthFillInIntentLocked(): no FillContext. requestId=" + requestId
|
||||
+ "; mContexts= " + mContexts);
|
||||
return null;
|
||||
}
|
||||
fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, context.getStructure());
|
||||
fillInIntent.putExtra(AutofillManager.EXTRA_CLIENT_STATE, extras);
|
||||
@@ -1748,7 +1766,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
if (mDestroyed) {
|
||||
return null;
|
||||
}
|
||||
mUi.destroyAll(mPendingSaveUi, this);
|
||||
mUi.destroyAll(mPendingSaveUi, this, true);
|
||||
mUi.clearCallback(this);
|
||||
mDestroyed = true;
|
||||
writeLog(MetricsEvent.AUTOFILL_SESSION_FINISHED);
|
||||
@@ -1764,7 +1782,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
|
||||
mPendingSaveUi = null;
|
||||
removeSelfLocked();
|
||||
mUi.destroyAll(mPendingSaveUi, this);
|
||||
|
||||
mHandlerCaller.getHandler().post(() -> {
|
||||
try {
|
||||
mClient.setState(mService.isEnabled(), true, false);
|
||||
} catch (RemoteException e) {
|
||||
Slog.w(TAG, "error updating client state: " + e);
|
||||
}
|
||||
});
|
||||
|
||||
mUi.destroyAll(mPendingSaveUi, this, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -275,7 +275,7 @@ public final class AutoFillUI {
|
||||
if (mCallback != null) {
|
||||
mCallback.save();
|
||||
}
|
||||
destroySaveUiUiThread(pendingSaveUi);
|
||||
destroySaveUiUiThread(pendingSaveUi, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -293,7 +293,7 @@ public final class AutoFillUI {
|
||||
if (mCallback != null) {
|
||||
mCallback.cancelSave();
|
||||
}
|
||||
destroySaveUiUiThread(pendingSaveUi);
|
||||
destroySaveUiUiThread(pendingSaveUi, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -335,8 +335,8 @@ public final class AutoFillUI {
|
||||
* Destroy all UI affordances.
|
||||
*/
|
||||
public void destroyAll(@Nullable PendingUi pendingSaveUi,
|
||||
@Nullable AutoFillUiCallback callback) {
|
||||
mHandler.post(() -> destroyAllUiThread(pendingSaveUi, callback));
|
||||
@Nullable AutoFillUiCallback callback, boolean notifyClient) {
|
||||
mHandler.post(() -> destroyAllUiThread(pendingSaveUi, callback, notifyClient));
|
||||
}
|
||||
|
||||
public void dump(PrintWriter pw) {
|
||||
@@ -379,7 +379,7 @@ public final class AutoFillUI {
|
||||
}
|
||||
|
||||
@android.annotation.UiThread
|
||||
private void destroySaveUiUiThread(@Nullable PendingUi pendingSaveUi) {
|
||||
private void destroySaveUiUiThread(@Nullable PendingUi pendingSaveUi, boolean notifyClient) {
|
||||
if (mSaveUi == null) {
|
||||
// Calling destroySaveUiUiThread() twice is normal - it usually happens when the
|
||||
// first call is made after the SaveUI is hidden and the second when the session is
|
||||
@@ -391,7 +391,7 @@ public final class AutoFillUI {
|
||||
if (sDebug) Slog.d(TAG, "destroySaveUiUiThread(): " + pendingSaveUi);
|
||||
mSaveUi.destroy();
|
||||
mSaveUi = null;
|
||||
if (pendingSaveUi != null) {
|
||||
if (pendingSaveUi != null && notifyClient) {
|
||||
try {
|
||||
if (sDebug) Slog.d(TAG, "destroySaveUiUiThread(): notifying client");
|
||||
pendingSaveUi.client.setSaveUiState(pendingSaveUi.id, false);
|
||||
@@ -403,9 +403,9 @@ public final class AutoFillUI {
|
||||
|
||||
@android.annotation.UiThread
|
||||
private void destroyAllUiThread(@Nullable PendingUi pendingSaveUi,
|
||||
@Nullable AutoFillUiCallback callback) {
|
||||
@Nullable AutoFillUiCallback callback, boolean notifyClient) {
|
||||
hideFillUiUiThread(callback);
|
||||
destroySaveUiUiThread(pendingSaveUi);
|
||||
destroySaveUiUiThread(pendingSaveUi, notifyClient);
|
||||
}
|
||||
|
||||
@android.annotation.UiThread
|
||||
@@ -417,7 +417,7 @@ public final class AutoFillUI {
|
||||
Slog.d(TAG, "hideAllUiThread(): "
|
||||
+ "destroying Save UI because pending restoration is finished");
|
||||
}
|
||||
destroySaveUiUiThread(pendingSaveUi);
|
||||
destroySaveUiUiThread(pendingSaveUi, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user