diff options
-rw-r--r-- | services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java index fcdf3cf6f857..13e5ab451cfc 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java @@ -930,7 +930,7 @@ public final class ContentCaptureManagerService extends } @Override - public void accept(IDataShareReadAdapter serviceAdapter) throws RemoteException { + public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException { Slog.i(TAG, "Data share request accepted by Content Capture service"); Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe(); @@ -967,6 +967,7 @@ public final class ContentCaptureManagerService extends bestEffortCloseFileDescriptors(sourceIn, sinkOut); mParentService.mDataShareExecutor.execute(() -> { + boolean receivedData = false; try (InputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(sinkIn); OutputStream fos = @@ -981,6 +982,8 @@ public final class ContentCaptureManagerService extends } fos.write(byteBuffer, 0 /* offset */, readBytes); + + receivedData = true; } } catch (IOException e) { Slog.e(TAG, "Failed to pipe client and service streams", e); @@ -992,6 +995,22 @@ public final class ContentCaptureManagerService extends mParentService.mPackagesWithShareRequests .remove(mDataShareRequest.getPackageName()); } + if (receivedData) { + try { + mClientAdapter.finish(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to call finish() the client operation", e); + } + try { + serviceAdapter.finish(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to call finish() the service operation", e); + } + } else { + // Client or service may have crashed before sending. + sendErrorSignal(mClientAdapter, serviceAdapter, + ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); + } } }); |