Merge "Got rid of cancellation signals in the Content Capture Data Sharing"
This commit is contained in:
committed by
Android (Google) Code Review
commit
e453dcef3b
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user