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

Commit 20d7af0f authored by Yara Hassan's avatar Yara Hassan Committed by Automerger Merge Worker
Browse files

Add westworld logging for CCAPI data share am: faf50e11 am: 7c3ef4c3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11818613

Change-Id: I23a2370b857d9ef38547f36267a21a4fd8c2582f
parents 8be850ea 7c3ef4c3
Loading
Loading
Loading
Loading
+49 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,15 @@ import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_SECU
import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_TRUE;
import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_TRUE;
import static android.view.contentcapture.ContentCaptureSession.STATE_DISABLED;
import static android.view.contentcapture.ContentCaptureSession.STATE_DISABLED;


import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ACCEPT_DATA_SHARE_REQUEST;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_EMPTY_DATA;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_IOEXCEPTION;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_WRITE_FINISHED;
import static com.android.internal.util.FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__REJECT_DATA_SHARE_REQUEST;
import static com.android.internal.util.SyncResultReceiver.bundleFor;
import static com.android.internal.util.SyncResultReceiver.bundleFor;


import android.annotation.NonNull;
import android.annotation.NonNull;
@@ -95,6 +104,7 @@ import java.util.List;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;


/**
/**
 * A service used to observe the contents of the screen.
 * A service used to observe the contents of the screen.
@@ -114,6 +124,14 @@ public final class ContentCaptureManagerService extends
    private static final int MAX_CONCURRENT_FILE_SHARING_REQUESTS = 10;
    private static final int MAX_CONCURRENT_FILE_SHARING_REQUESTS = 10;
    private static final int DATA_SHARE_BYTE_BUFFER_LENGTH = 1_024;
    private static final int DATA_SHARE_BYTE_BUFFER_LENGTH = 1_024;


    // Needed to pass checkstyle_hook as names are too long for one line.
    private static final int EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST =
            CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST;
    private static final int EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED =
            CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED;
    private static final int EVENT__DATA_SHARE_WRITE_FINISHED =
            CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_WRITE_FINISHED;

    private final LocalService mLocalService = new LocalService();
    private final LocalService mLocalService = new LocalService();


    @Nullable
    @Nullable
@@ -657,6 +675,10 @@ public final class ContentCaptureManagerService extends
                if (mPackagesWithShareRequests.size() >= MAX_CONCURRENT_FILE_SHARING_REQUESTS
                if (mPackagesWithShareRequests.size() >= MAX_CONCURRENT_FILE_SHARING_REQUESTS
                        || mPackagesWithShareRequests.contains(request.getPackageName())) {
                        || mPackagesWithShareRequests.contains(request.getPackageName())) {
                    try {
                    try {
                        String serviceName = mServiceNameResolver.getServiceName(userId);
                        ContentCaptureMetricsLogger.writeServiceEvent(
                                EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST,
                                serviceName, request.getPackageName());
                        clientAdapter.error(
                        clientAdapter.error(
                                ContentCaptureManager.DATA_SHARE_ERROR_CONCURRENT_REQUEST);
                                ContentCaptureManager.DATA_SHARE_ERROR_CONCURRENT_REQUEST);
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
@@ -920,6 +942,7 @@ public final class ContentCaptureManagerService extends
        @NonNull private final DataShareRequest mDataShareRequest;
        @NonNull private final DataShareRequest mDataShareRequest;
        @NonNull private final IDataShareWriteAdapter mClientAdapter;
        @NonNull private final IDataShareWriteAdapter mClientAdapter;
        @NonNull private final ContentCaptureManagerService mParentService;
        @NonNull private final ContentCaptureManagerService mParentService;
        @NonNull private final AtomicBoolean mLoggedWriteFinish = new AtomicBoolean(false);


        DataShareCallbackDelegate(@NonNull DataShareRequest dataShareRequest,
        DataShareCallbackDelegate(@NonNull DataShareRequest dataShareRequest,
                @NonNull IDataShareWriteAdapter clientAdapter,
                @NonNull IDataShareWriteAdapter clientAdapter,
@@ -932,9 +955,12 @@ public final class ContentCaptureManagerService extends
        @Override
        @Override
        public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException {
        public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException {
            Slog.i(TAG, "Data share request accepted by Content Capture service");
            Slog.i(TAG, "Data share request accepted by Content Capture service");
            logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ACCEPT_DATA_SHARE_REQUEST);


            Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe();
            Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe();
            if (clientPipe == null) {
            if (clientPipe == null) {
                logServiceEvent(
                        CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL);
                mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                return;
                return;
@@ -945,6 +971,8 @@ public final class ContentCaptureManagerService extends


            Pair<ParcelFileDescriptor, ParcelFileDescriptor> servicePipe = createPipe();
            Pair<ParcelFileDescriptor, ParcelFileDescriptor> servicePipe = createPipe();
            if (servicePipe == null) {
            if (servicePipe == null) {
                logServiceEvent(
                        CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL);
                bestEffortCloseFileDescriptors(sourceIn, sinkIn);
                bestEffortCloseFileDescriptors(sourceIn, sinkIn);


                mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
@@ -987,6 +1015,8 @@ public final class ContentCaptureManagerService extends
                    }
                    }
                } catch (IOException e) {
                } catch (IOException e) {
                    Slog.e(TAG, "Failed to pipe client and service streams", e);
                    Slog.e(TAG, "Failed to pipe client and service streams", e);
                    logServiceEvent(
                            CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_IOEXCEPTION);


                    sendErrorSignal(mClientAdapter, serviceAdapter,
                    sendErrorSignal(mClientAdapter, serviceAdapter,
                            ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                            ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
@@ -996,6 +1026,10 @@ public final class ContentCaptureManagerService extends
                                .remove(mDataShareRequest.getPackageName());
                                .remove(mDataShareRequest.getPackageName());
                    }
                    }
                    if (receivedData) {
                    if (receivedData) {
                        if (!mLoggedWriteFinish.get()) {
                            logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED);
                            mLoggedWriteFinish.set(true);
                        }
                        try {
                        try {
                            mClientAdapter.finish();
                            mClientAdapter.finish();
                        } catch (RemoteException e) {
                        } catch (RemoteException e) {
@@ -1008,6 +1042,8 @@ public final class ContentCaptureManagerService extends
                        }
                        }
                    } else {
                    } else {
                        // Client or service may have crashed before sending.
                        // Client or service may have crashed before sending.
                        logServiceEvent(
                                CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_EMPTY_DATA);
                        sendErrorSignal(mClientAdapter, serviceAdapter,
                        sendErrorSignal(mClientAdapter, serviceAdapter,
                                ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                                ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN);
                    }
                    }
@@ -1027,6 +1063,7 @@ public final class ContentCaptureManagerService extends
        @Override
        @Override
        public void reject() throws RemoteException {
        public void reject() throws RemoteException {
            Slog.i(TAG, "Data share request rejected by Content Capture service");
            Slog.i(TAG, "Data share request rejected by Content Capture service");
            logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__REJECT_DATA_SHARE_REQUEST);


            mClientAdapter.rejected();
            mClientAdapter.rejected();
        }
        }
@@ -1048,11 +1085,16 @@ public final class ContentCaptureManagerService extends
                        && !sourceOut.getFileDescriptor().valid();
                        && !sourceOut.getFileDescriptor().valid();


                if (finishedSuccessfully) {
                if (finishedSuccessfully) {
                    if (!mLoggedWriteFinish.get()) {
                        logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED);
                        mLoggedWriteFinish.set(true);
                    }
                    Slog.i(TAG, "Content capture data sharing session terminated "
                    Slog.i(TAG, "Content capture data sharing session terminated "
                            + "successfully for package '"
                            + "successfully for package '"
                            + mDataShareRequest.getPackageName()
                            + mDataShareRequest.getPackageName()
                            + "'");
                            + "'");
                } else {
                } else {
                    logServiceEvent(EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED);
                    Slog.i(TAG, "Reached the timeout of Content Capture data sharing session "
                    Slog.i(TAG, "Reached the timeout of Content Capture data sharing session "
                            + "for package '"
                            + "for package '"
                            + mDataShareRequest.getPackageName()
                            + mDataShareRequest.getPackageName()
@@ -1123,5 +1165,12 @@ public final class ContentCaptureManagerService extends
                Slog.e(TAG, "Failed to call error() the service operation", e);
                Slog.e(TAG, "Failed to call error() the service operation", e);
            }
            }
        }
        }

        private void logServiceEvent(int eventType) {
            int userId = UserHandle.getCallingUserId();
            String serviceName = mParentService.mServiceNameResolver.getServiceName(userId);
            ContentCaptureMetricsLogger.writeServiceEvent(eventType, serviceName,
                    mDataShareRequest.getPackageName());
        }
    }
    }
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -156,6 +156,9 @@ final class RemoteContentCaptureService
    public void onDataShareRequest(@NonNull DataShareRequest request,
    public void onDataShareRequest(@NonNull DataShareRequest request,
            @NonNull IDataShareCallback.Stub dataShareCallback) {
            @NonNull IDataShareCallback.Stub dataShareCallback) {
        scheduleAsyncRequest((s) -> s.onDataShared(request, dataShareCallback));
        scheduleAsyncRequest((s) -> s.onDataShared(request, dataShareCallback));
        writeServiceEvent(
                FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ON_DATA_SHARE_REQUEST,
                mComponentName, request.getPackageName());
    }
    }


    /**
    /**