Loading core/java/android/service/contentcapture/ContentCaptureService.java +22 −5 Original line number Diff line number Diff line Loading @@ -544,11 +544,14 @@ public abstract class ContentCaptureService extends Service { Preconditions.checkNotNull(adapter); Preconditions.checkNotNull(executor); DataShareReadAdapterDelegate delegate = new DataShareReadAdapterDelegate(executor, adapter); ICancellationSignal cancellationSignalTransport = CancellationSignal.createTransport(); DataShareReadAdapterDelegate delegate = new DataShareReadAdapterDelegate( executor, cancellationSignalTransport, adapter); try { callback.accept(delegate); callback.accept(cancellationSignalTransport, delegate); } catch (RemoteException e) { Slog.e(TAG, "Failed to accept data sharing", e); } Loading Loading @@ -655,12 +658,16 @@ public abstract class ContentCaptureService extends Service { private final Object mLock = new Object(); private final WeakReference<DataShareReadAdapter> mAdapterReference; private final WeakReference<Executor> mExecutorReference; private final WeakReference<ICancellationSignal> mCancellationSignalReference; DataShareReadAdapterDelegate(Executor executor, DataShareReadAdapter adapter) { DataShareReadAdapterDelegate(Executor executor, ICancellationSignal cancellationSignalTransport, DataShareReadAdapter adapter) { Preconditions.checkNotNull(executor); Preconditions.checkNotNull(cancellationSignalTransport); Preconditions.checkNotNull(adapter); mExecutorReference = new WeakReference<>(executor); mCancellationSignalReference = new WeakReference<>(cancellationSignalTransport); mAdapterReference = new WeakReference<>(adapter); } Loading @@ -668,7 +675,17 @@ public abstract class ContentCaptureService extends Service { public void start(ParcelFileDescriptor fd, ICancellationSignal remoteCancellationSignal) throws RemoteException { synchronized (mLock) { CancellationSignal cancellationSignal = new CancellationSignal(); ICancellationSignal serverControlledCancellationSignal = mCancellationSignalReference.get(); if (serverControlledCancellationSignal == null) { Slog.w(TAG, "Can't execute onStart(), reference to cancellation signal has " + "been GC'ed"); return; } CancellationSignal cancellationSignal = CancellationSignal.fromTransport(serverControlledCancellationSignal); cancellationSignal.setRemote(remoteCancellationSignal); executeAdapterMethodLocked( Loading core/java/android/service/contentcapture/DataShareReadAdapter.java +1 −2 Original line number Diff line number Diff line Loading @@ -40,8 +40,7 @@ public interface DataShareReadAdapter { void onStart(@NonNull ParcelFileDescriptor fd, @NonNull CancellationSignal cancellationSignal); /** * Signals that the session failed to start or terminated unsuccessfully (e.g. due to a * timeout). * Signals that the session failed to start or terminated unsuccessfully. **/ void onError(int errorCode); } core/java/android/service/contentcapture/IDataShareCallback.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -16,10 +16,11 @@ package android.service.contentcapture; import android.os.ICancellationSignal; import android.service.contentcapture.IDataShareReadAdapter; /** @hide */ oneway interface IDataShareCallback { void accept(in IDataShareReadAdapter adapter); void accept(in ICancellationSignal cancellationSignal, in IDataShareReadAdapter adapter); void reject(); } core/java/android/view/contentcapture/ContentCaptureManager.java +19 −5 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Binder; import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; import android.os.ICancellationSignal; import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.RemoteException; Loading Loading @@ -655,9 +656,12 @@ public final class ContentCaptureManager { Preconditions.checkNotNull(dataShareWriteAdapter); Preconditions.checkNotNull(executor); ICancellationSignal cancellationSignalTransport = CancellationSignal.createTransport(); try { mService.shareData(request, new DataShareAdapterDelegate(executor, dataShareWriteAdapter)); mService.shareData(request, cancellationSignalTransport, new DataShareAdapterDelegate(executor, cancellationSignalTransport, dataShareWriteAdapter)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } Loading Loading @@ -715,20 +719,30 @@ public final class ContentCaptureManager { private final WeakReference<DataShareWriteAdapter> mAdapterReference; private final WeakReference<Executor> mExecutorReference; private final WeakReference<ICancellationSignal> mCancellationSignal; private DataShareAdapterDelegate(Executor executor, DataShareWriteAdapter adapter) { private DataShareAdapterDelegate(Executor executor, ICancellationSignal cancellationSignalTransport, DataShareWriteAdapter adapter) { Preconditions.checkNotNull(executor); Preconditions.checkNotNull(cancellationSignalTransport); Preconditions.checkNotNull(adapter); mExecutorReference = new WeakReference<>(executor); mAdapterReference = new WeakReference<>(adapter); mCancellationSignal = new WeakReference<>(cancellationSignalTransport); } @Override public void write(ParcelFileDescriptor destination) throws RemoteException { // TODO(b/148264965): implement this. CancellationSignal cancellationSignal = new CancellationSignal(); ICancellationSignal cancellationSignalTransport = mCancellationSignal.get(); if (cancellationSignalTransport == null) { Slog.w(TAG, "Can't execute write(), reference to cancellation signal has been " + "GC'ed"); } CancellationSignal cancellationSignal = CancellationSignal.fromTransport(cancellationSignalTransport); executeAdapterMethodLocked(adapter -> adapter.onWrite(destination, cancellationSignal), "onWrite"); } Loading core/java/android/view/contentcapture/IContentCaptureManager.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.view.contentcapture.DataRemovalRequest; import android.view.contentcapture.DataShareRequest; import android.view.contentcapture.IDataShareWriteAdapter; import android.os.IBinder; import android.os.ICancellationSignal; import com.android.internal.os.IResultReceiver; Loading Loading @@ -68,7 +69,8 @@ oneway interface IContentCaptureManager { /** * Requests sharing of a binary data with the content capture service. */ void shareData(in DataShareRequest request, in IDataShareWriteAdapter adapter); void shareData(in DataShareRequest request, in ICancellationSignal cancellationSignal, in IDataShareWriteAdapter adapter); /** * Returns whether the content capture feature is enabled for the calling user. Loading Loading
core/java/android/service/contentcapture/ContentCaptureService.java +22 −5 Original line number Diff line number Diff line Loading @@ -544,11 +544,14 @@ public abstract class ContentCaptureService extends Service { Preconditions.checkNotNull(adapter); Preconditions.checkNotNull(executor); DataShareReadAdapterDelegate delegate = new DataShareReadAdapterDelegate(executor, adapter); ICancellationSignal cancellationSignalTransport = CancellationSignal.createTransport(); DataShareReadAdapterDelegate delegate = new DataShareReadAdapterDelegate( executor, cancellationSignalTransport, adapter); try { callback.accept(delegate); callback.accept(cancellationSignalTransport, delegate); } catch (RemoteException e) { Slog.e(TAG, "Failed to accept data sharing", e); } Loading Loading @@ -655,12 +658,16 @@ public abstract class ContentCaptureService extends Service { private final Object mLock = new Object(); private final WeakReference<DataShareReadAdapter> mAdapterReference; private final WeakReference<Executor> mExecutorReference; private final WeakReference<ICancellationSignal> mCancellationSignalReference; DataShareReadAdapterDelegate(Executor executor, DataShareReadAdapter adapter) { DataShareReadAdapterDelegate(Executor executor, ICancellationSignal cancellationSignalTransport, DataShareReadAdapter adapter) { Preconditions.checkNotNull(executor); Preconditions.checkNotNull(cancellationSignalTransport); Preconditions.checkNotNull(adapter); mExecutorReference = new WeakReference<>(executor); mCancellationSignalReference = new WeakReference<>(cancellationSignalTransport); mAdapterReference = new WeakReference<>(adapter); } Loading @@ -668,7 +675,17 @@ public abstract class ContentCaptureService extends Service { public void start(ParcelFileDescriptor fd, ICancellationSignal remoteCancellationSignal) throws RemoteException { synchronized (mLock) { CancellationSignal cancellationSignal = new CancellationSignal(); ICancellationSignal serverControlledCancellationSignal = mCancellationSignalReference.get(); if (serverControlledCancellationSignal == null) { Slog.w(TAG, "Can't execute onStart(), reference to cancellation signal has " + "been GC'ed"); return; } CancellationSignal cancellationSignal = CancellationSignal.fromTransport(serverControlledCancellationSignal); cancellationSignal.setRemote(remoteCancellationSignal); executeAdapterMethodLocked( Loading
core/java/android/service/contentcapture/DataShareReadAdapter.java +1 −2 Original line number Diff line number Diff line Loading @@ -40,8 +40,7 @@ public interface DataShareReadAdapter { void onStart(@NonNull ParcelFileDescriptor fd, @NonNull CancellationSignal cancellationSignal); /** * Signals that the session failed to start or terminated unsuccessfully (e.g. due to a * timeout). * Signals that the session failed to start or terminated unsuccessfully. **/ void onError(int errorCode); }
core/java/android/service/contentcapture/IDataShareCallback.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -16,10 +16,11 @@ package android.service.contentcapture; import android.os.ICancellationSignal; import android.service.contentcapture.IDataShareReadAdapter; /** @hide */ oneway interface IDataShareCallback { void accept(in IDataShareReadAdapter adapter); void accept(in ICancellationSignal cancellationSignal, in IDataShareReadAdapter adapter); void reject(); }
core/java/android/view/contentcapture/ContentCaptureManager.java +19 −5 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Binder; import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; import android.os.ICancellationSignal; import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.RemoteException; Loading Loading @@ -655,9 +656,12 @@ public final class ContentCaptureManager { Preconditions.checkNotNull(dataShareWriteAdapter); Preconditions.checkNotNull(executor); ICancellationSignal cancellationSignalTransport = CancellationSignal.createTransport(); try { mService.shareData(request, new DataShareAdapterDelegate(executor, dataShareWriteAdapter)); mService.shareData(request, cancellationSignalTransport, new DataShareAdapterDelegate(executor, cancellationSignalTransport, dataShareWriteAdapter)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } Loading Loading @@ -715,20 +719,30 @@ public final class ContentCaptureManager { private final WeakReference<DataShareWriteAdapter> mAdapterReference; private final WeakReference<Executor> mExecutorReference; private final WeakReference<ICancellationSignal> mCancellationSignal; private DataShareAdapterDelegate(Executor executor, DataShareWriteAdapter adapter) { private DataShareAdapterDelegate(Executor executor, ICancellationSignal cancellationSignalTransport, DataShareWriteAdapter adapter) { Preconditions.checkNotNull(executor); Preconditions.checkNotNull(cancellationSignalTransport); Preconditions.checkNotNull(adapter); mExecutorReference = new WeakReference<>(executor); mAdapterReference = new WeakReference<>(adapter); mCancellationSignal = new WeakReference<>(cancellationSignalTransport); } @Override public void write(ParcelFileDescriptor destination) throws RemoteException { // TODO(b/148264965): implement this. CancellationSignal cancellationSignal = new CancellationSignal(); ICancellationSignal cancellationSignalTransport = mCancellationSignal.get(); if (cancellationSignalTransport == null) { Slog.w(TAG, "Can't execute write(), reference to cancellation signal has been " + "GC'ed"); } CancellationSignal cancellationSignal = CancellationSignal.fromTransport(cancellationSignalTransport); executeAdapterMethodLocked(adapter -> adapter.onWrite(destination, cancellationSignal), "onWrite"); } Loading
core/java/android/view/contentcapture/IContentCaptureManager.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.view.contentcapture.DataRemovalRequest; import android.view.contentcapture.DataShareRequest; import android.view.contentcapture.IDataShareWriteAdapter; import android.os.IBinder; import android.os.ICancellationSignal; import com.android.internal.os.IResultReceiver; Loading Loading @@ -68,7 +69,8 @@ oneway interface IContentCaptureManager { /** * Requests sharing of a binary data with the content capture service. */ void shareData(in DataShareRequest request, in IDataShareWriteAdapter adapter); void shareData(in DataShareRequest request, in ICancellationSignal cancellationSignal, in IDataShareWriteAdapter adapter); /** * Returns whether the content capture feature is enabled for the calling user. Loading