Merge "Got rid of cancellation signals in the Content Capture Data Sharing"

This commit is contained in:
Sergey Volnov
2020-01-29 20:24:48 +00:00
committed by Android (Google) Code Review
10 changed files with 84 additions and 129 deletions

View File

@@ -34,10 +34,8 @@ import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.Bundle;
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;
@@ -544,14 +542,11 @@ public abstract class ContentCaptureService extends Service {
Preconditions.checkNotNull(adapter);
Preconditions.checkNotNull(executor);
ICancellationSignal cancellationSignalTransport =
CancellationSignal.createTransport();
DataShareReadAdapterDelegate delegate = new DataShareReadAdapterDelegate(
executor, cancellationSignalTransport, adapter);
DataShareReadAdapterDelegate delegate =
new DataShareReadAdapterDelegate(executor, adapter);
try {
callback.accept(cancellationSignalTransport, delegate);
callback.accept(delegate);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to accept data sharing", e);
}
@@ -658,38 +653,20 @@ 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,
ICancellationSignal cancellationSignalTransport, DataShareReadAdapter adapter) {
DataShareReadAdapterDelegate(Executor executor, DataShareReadAdapter adapter) {
Preconditions.checkNotNull(executor);
Preconditions.checkNotNull(cancellationSignalTransport);
Preconditions.checkNotNull(adapter);
mExecutorReference = new WeakReference<>(executor);
mCancellationSignalReference = new WeakReference<>(cancellationSignalTransport);
mAdapterReference = new WeakReference<>(adapter);
}
@Override
public void start(ParcelFileDescriptor fd, ICancellationSignal remoteCancellationSignal)
public void start(ParcelFileDescriptor fd)
throws RemoteException {
synchronized (mLock) {
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(
adapter -> adapter.onStart(fd, cancellationSignal), "onStart");
executeAdapterMethodLocked(adapter -> adapter.onStart(fd), "onStart");
}
}

View File

@@ -18,7 +18,6 @@ package android.service.contentcapture;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
/**
@@ -34,13 +33,16 @@ public interface DataShareReadAdapter {
* Signals the start of the data sharing session.
*
* @param fd file descriptor to use for reading data, that's being shared
* @param cancellationSignal cancellation signal to use if data is no longer needed and the
* session needs to be terminated.
**/
void onStart(@NonNull ParcelFileDescriptor fd, @NonNull CancellationSignal cancellationSignal);
void onStart(@NonNull ParcelFileDescriptor fd);
/**
* Signals that the session failed to start or terminated unsuccessfully.
*
* <p>Important: together with the error, file sharing stream might be closed, and therefore
* reading from {@code fd} from {@link #onStart} will result in the end of stream. The order of
* these 2 events is not defined, and it's important that the service treats end of stream
* correctly in this situation.
**/
void onError(int errorCode);
}

View File

@@ -21,6 +21,6 @@ import android.service.contentcapture.IDataShareReadAdapter;
/** @hide */
oneway interface IDataShareCallback {
void accept(in ICancellationSignal cancellationSignal, in IDataShareReadAdapter adapter);
void accept(in IDataShareReadAdapter adapter);
void reject();
}

View File

@@ -20,6 +20,6 @@ import android.os.ICancellationSignal;
/** @hide */
oneway interface IDataShareReadAdapter {
void start(in ParcelFileDescriptor fd, in ICancellationSignal cancellationSignal);
void start(in ParcelFileDescriptor fd);
void error(int errorCode);
}

View File

@@ -32,10 +32,8 @@ import android.content.ContentCaptureOptions;
import android.content.Context;
import android.graphics.Canvas;
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;
@@ -209,6 +207,15 @@ public final class ContentCaptureManager {
private static final String TAG = ContentCaptureManager.class.getSimpleName();
/** Error happened during the data sharing session. */
public static final int DATA_SHARE_ERROR_UNKNOWN = 1;
/** Request has been rejected, because a concurrent data share sessions is in progress. */
public static final int DATA_SHARE_ERROR_CONCURRENT_REQUEST = 2;
/** Request has been interrupted because of data share session timeout. */
public static final int DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED = 3;
/** @hide */
public static final int RESULT_CODE_OK = 0;
/** @hide */
@@ -656,12 +663,9 @@ public final class ContentCaptureManager {
Preconditions.checkNotNull(dataShareWriteAdapter);
Preconditions.checkNotNull(executor);
ICancellationSignal cancellationSignalTransport = CancellationSignal.createTransport();
try {
mService.shareData(request, cancellationSignalTransport,
new DataShareAdapterDelegate(executor,
cancellationSignalTransport, dataShareWriteAdapter));
mService.shareData(request,
new DataShareAdapterDelegate(executor, dataShareWriteAdapter));
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
@@ -719,32 +723,19 @@ public final class ContentCaptureManager {
private final WeakReference<DataShareWriteAdapter> mAdapterReference;
private final WeakReference<Executor> mExecutorReference;
private final WeakReference<ICancellationSignal> mCancellationSignal;
private DataShareAdapterDelegate(Executor executor,
ICancellationSignal cancellationSignalTransport, DataShareWriteAdapter adapter) {
private DataShareAdapterDelegate(Executor executor, 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 {
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");
executeAdapterMethodLocked(adapter -> adapter.onWrite(destination), "onWrite");
}
@Override

View File

@@ -17,18 +17,11 @@
package android.view.contentcapture;
import android.annotation.NonNull;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
/** Adapter class used by apps to share data with the Content Capture service. */
public interface DataShareWriteAdapter {
/** Request has been rejected, because a concurrent data share sessions is in progress. */
int ERROR_CONCURRENT_REQUEST = 1;
/** Data share session timed out. */
int ERROR_UNKNOWN = 2;
/**
* Method invoked when the data share session has been started and the app needs to start
* writing into the file used for sharing.
@@ -36,12 +29,9 @@ public interface DataShareWriteAdapter {
* <p>App needs to handle explicitly cases when the file descriptor is closed and handle
* gracefully if IOExceptions happen.
*
* @param destination file descriptor used to write data into
* @param cancellationSignal cancellation signal that the app can use to subscribe to cancel
* operations.
* @param destination file descriptor used to write data into.
*/
void onWrite(@NonNull ParcelFileDescriptor destination,
@NonNull CancellationSignal cancellationSignal);
void onWrite(@NonNull ParcelFileDescriptor destination);
/** Data share sessions has been rejected by the Content Capture service. */
void onRejected();

View File

@@ -69,8 +69,7 @@ oneway interface IContentCaptureManager {
/**
* Requests sharing of a binary data with the content capture service.
*/
void shareData(in DataShareRequest request, in ICancellationSignal cancellationSignal,
in IDataShareWriteAdapter adapter);
void shareData(in DataShareRequest request, in IDataShareWriteAdapter adapter);
/**
* Returns whether the content capture feature is enabled for the calling user.