diff options
author | Yara Hassan <yaraabdullatif@google.com> | 2020-05-20 17:38:20 +0100 |
---|---|---|
committer | Ahaan Ugale <augale@google.com> | 2020-05-29 14:35:13 -0700 |
commit | dc699fb8cea5f97020152b75641dfcb641e7e96a (patch) | |
tree | 76014968c516be81bf0ab8816f3d5e71e25c972e | |
parent | 1298d2b7601383ad6e9c6964e939f6bfbd7093e2 (diff) |
Add finish() method to DataShare Read and Write Adapters
The finish() method is used to clear hard references after
the data copy has ended. This fixes a bug where the references are cleared before onError() is attempted to be called.
Test: CTS tests in followup CL
Bug: 157136368
Fixes: 157136368
Change-Id: If924fe388762831af90579e6b00bdf223230e203
4 files changed, 14 insertions, 8 deletions
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java index 46cb65babc1c..b1f147be6735 100644 --- a/core/java/android/service/contentcapture/ContentCaptureService.java +++ b/core/java/android/service/contentcapture/ContentCaptureService.java @@ -677,10 +677,6 @@ public abstract class ContentCaptureService extends Service { throws RemoteException { synchronized (mLock) { executeAdapterMethodLocked(adapter -> adapter.onStart(fd), "onStart"); - - // Client app and Service successfully connected, so this object would be kept alive - // until the session has finished. - clearHardReferences(); } } @@ -693,6 +689,13 @@ public abstract class ContentCaptureService extends Service { } } + @Override + public void finish() throws RemoteException { + synchronized (mLock) { + clearHardReferences(); + } + } + private void executeAdapterMethodLocked(Consumer<DataShareReadAdapter> adapterFn, String methodName) { LocalDataShareAdapterResourceManager resourceManager = mResourceManagerReference.get(); diff --git a/core/java/android/service/contentcapture/IDataShareReadAdapter.aidl b/core/java/android/service/contentcapture/IDataShareReadAdapter.aidl index 91c8ff1fc662..4d441fe2b856 100644 --- a/core/java/android/service/contentcapture/IDataShareReadAdapter.aidl +++ b/core/java/android/service/contentcapture/IDataShareReadAdapter.aidl @@ -22,4 +22,5 @@ import android.os.ICancellationSignal; oneway interface IDataShareReadAdapter { void start(in ParcelFileDescriptor fd); void error(int errorCode); + void finish(); } diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java index d021fc917c88..756ff78e5906 100644 --- a/core/java/android/view/contentcapture/ContentCaptureManager.java +++ b/core/java/android/view/contentcapture/ContentCaptureManager.java @@ -761,10 +761,6 @@ public final class ContentCaptureManager { public void write(ParcelFileDescriptor destination) throws RemoteException { executeAdapterMethodLocked(adapter -> adapter.onWrite(destination), "onWrite"); - - // Client app and Service successfully connected, so this object would be kept alive - // until the session has finished. - clearHardReferences(); } @Override @@ -779,6 +775,11 @@ public final class ContentCaptureManager { clearHardReferences(); } + @Override + public void finish() throws RemoteException { + clearHardReferences(); + } + private void executeAdapterMethodLocked(Consumer<DataShareWriteAdapter> adapterFn, String methodName) { LocalDataShareAdapterResourceManager resourceManager = mResourceManagerReference.get(); diff --git a/core/java/android/view/contentcapture/IDataShareWriteAdapter.aidl b/core/java/android/view/contentcapture/IDataShareWriteAdapter.aidl index 80924ef78f85..015b3bc2a00b 100644 --- a/core/java/android/view/contentcapture/IDataShareWriteAdapter.aidl +++ b/core/java/android/view/contentcapture/IDataShareWriteAdapter.aidl @@ -25,4 +25,5 @@ oneway interface IDataShareWriteAdapter { void write(in ParcelFileDescriptor destination); void error(int errorCode); void rejected(); + void finish(); } |