Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed8ce564 authored by Sergey Volnov's avatar Sergey Volnov Committed by Android (Google) Code Review
Browse files

Merge "Use cancellation signals for timeouts and cancel-by-CCService operations"

parents 85ca06eb d7e98444
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -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(
+1 −2
Original line number Diff line number Diff line
@@ -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);
}
+2 −1
Original line number Diff line number Diff line
@@ -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();
}
+19 −5
Original line number Diff line number Diff line
@@ -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");
        }
+3 −1
Original line number Diff line number Diff line
@@ -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.
Loading