Merge "Ensure remote calls to a fill service timeout." into oc-dev am: 208711a1e4

am: 3db119efa8

Change-Id: I60e696d1614bf1bd43dbbeac7e9b021395e7d13c
This commit is contained in:
Svet Ganov
2017-05-11 23:35:58 +00:00
committed by android-build-merger

View File

@@ -27,11 +27,13 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.ICancellationSignal;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.service.autofill.AutofillService;
import android.service.autofill.FillRequest;
@@ -43,6 +45,7 @@ import android.service.autofill.SaveRequest;
import android.text.format.DateUtils;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.HandlerCaller;
import com.android.server.FgThread;
@@ -63,6 +66,9 @@ final class RemoteFillService implements DeathRecipient {
// How long after the last interaction with the service we would unbind
private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
// How long after we make a remote request to a fill service we timeout
private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
private final Context mContext;
private final ComponentName mComponentName;
@@ -413,12 +419,18 @@ final class RemoteFillService implements DeathRecipient {
private static final class PendingFillRequest extends PendingRequest {
private final Object mLock = new Object();
private final WeakReference<RemoteFillService> mWeakService;
private final FillRequest mRequest;
private final IFillCallback mCallback;
private ICancellationSignal mCancellation;
@GuardedBy("mLock")
private boolean mCancelled;
@GuardedBy("mLock")
private boolean mCompleted;
public PendingFillRequest(FillRequest request, RemoteFillService service) {
mRequest = request;
mWeakService = new WeakReference<>(service);
@@ -443,8 +455,15 @@ final class RemoteFillService implements DeathRecipient {
@Override
public void onSuccess(FillResponse response) {
synchronized (mLock) {
if (mCompleted) {
return;
}
mCompleted = true;
}
RemoteFillService remoteService = mWeakService.get();
if (remoteService != null) {
service.mHandler.getHandler().removeCallbacks(PendingFillRequest.this);
remoteService.dispatchOnFillRequestSuccess(PendingFillRequest.this,
getCallingUid(), request.getFlags(), response);
}
@@ -452,13 +471,29 @@ final class RemoteFillService implements DeathRecipient {
@Override
public void onFailure(CharSequence message) {
synchronized (mLock) {
if (mCompleted) {
return;
}
mCompleted = true;
}
RemoteFillService remoteService = mWeakService.get();
if (remoteService != null) {
service.mHandler.getHandler().removeCallbacks(PendingFillRequest.this);
remoteService.dispatchOnFillRequestFailure(
PendingFillRequest.this, message);
}
}
};
service.mHandler.getHandler().postAtTime(() -> {
cancel();
try {
mCallback.onFailure(null);
} catch (RemoteException e) {
/* ignore */
}
}, PendingFillRequest.this,
SystemClock.uptimeMillis() + TIMEOUT_REMOTE_REQUEST_MILLIS);
}
@Override
@@ -496,10 +531,15 @@ final class RemoteFillService implements DeathRecipient {
}
private static final class PendingSaveRequest extends PendingRequest {
private final Object mLock = new Object();
private final WeakReference<RemoteFillService> mWeakService;
private final SaveRequest mRequest;
private final ISaveCallback mCallback;
@GuardedBy("mLock")
private boolean mCompleted;
public PendingSaveRequest(@NonNull SaveRequest request,
@NonNull RemoteFillService service) {
mRequest = request;
@@ -507,8 +547,16 @@ final class RemoteFillService implements DeathRecipient {
mCallback = new ISaveCallback.Stub() {
@Override
public void onSuccess() {
synchronized (mLock) {
if (mCompleted) {
return;
}
mCompleted = true;
}
cancel();
RemoteFillService service = mWeakService.get();
if (service != null) {
service.mHandler.getHandler().removeCallbacks(PendingSaveRequest.this);
service.dispatchOnSaveRequestSuccess(
PendingSaveRequest.this);
}
@@ -516,13 +564,29 @@ final class RemoteFillService implements DeathRecipient {
@Override
public void onFailure(CharSequence message) {
synchronized (mLock) {
if (mCompleted) {
return;
}
mCompleted = true;
}
RemoteFillService service = mWeakService.get();
if (service != null) {
service.mHandler.getHandler().removeCallbacks(PendingSaveRequest.this);
service.dispatchOnSaveRequestFailure(
PendingSaveRequest.this, message);
}
}
};
service.mHandler.getHandler().postAtTime(() -> {
cancel();
try {
mCallback.onFailure(null);
} catch (RemoteException e) {
/* ignore */
}
}, PendingSaveRequest.this,
SystemClock.uptimeMillis() + TIMEOUT_REMOTE_REQUEST_MILLIS);
}
@Override