summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorSergey Volnov <volnov@google.com>2020-01-24 15:48:02 +0000
committerSergey Volnov <volnov@google.com>2020-01-24 16:57:35 +0000
commitd7e984444503b5d1bcaed9fb9c914651f80616f4 (patch)
tree67f1de22d95552001340d2273a7caa04b15a04e0 /core/java
parent6e049014a75aef84c6c76bfa8fcaf761f95a5d2d (diff)
Use cancellation signals for timeouts and cancel-by-CCService operations
Bug: 148264965 Test: built Android + manually tested Change-Id: I95f7ec2bb96b8b6d6ead106877f9d7128e3ec209
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/service/contentcapture/ContentCaptureService.java27
-rw-r--r--core/java/android/service/contentcapture/DataShareReadAdapter.java3
-rw-r--r--core/java/android/service/contentcapture/IDataShareCallback.aidl3
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureManager.java24
-rw-r--r--core/java/android/view/contentcapture/IContentCaptureManager.aidl4
5 files changed, 47 insertions, 14 deletions
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index 36e2d1f6b251..ac2532dcea7d 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -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);
}
@@ -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);
}
@@ -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(
diff --git a/core/java/android/service/contentcapture/DataShareReadAdapter.java b/core/java/android/service/contentcapture/DataShareReadAdapter.java
index d9350ba5d774..ca6820110ea9 100644
--- a/core/java/android/service/contentcapture/DataShareReadAdapter.java
+++ b/core/java/android/service/contentcapture/DataShareReadAdapter.java
@@ -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);
}
diff --git a/core/java/android/service/contentcapture/IDataShareCallback.aidl b/core/java/android/service/contentcapture/IDataShareCallback.aidl
index c1aa1bb7dcb5..d972adadb53c 100644
--- a/core/java/android/service/contentcapture/IDataShareCallback.aidl
+++ b/core/java/android/service/contentcapture/IDataShareCallback.aidl
@@ -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();
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 81c83834098c..cede3b5cf9fe 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -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;
@@ -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();
}
@@ -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");
}
diff --git a/core/java/android/view/contentcapture/IContentCaptureManager.aidl b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
index e8d85ac69907..5217e68eac50 100644
--- a/core/java/android/view/contentcapture/IContentCaptureManager.aidl
+++ b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
@@ -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;
@@ -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.