Loading services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +49 −0 Original line number Diff line number Diff line Loading @@ -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.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 android.annotation.NonNull; Loading Loading @@ -95,6 +104,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; /** * A service used to observe the contents of the screen. Loading @@ -114,6 +124,14 @@ public final class ContentCaptureManagerService extends private static final int MAX_CONCURRENT_FILE_SHARING_REQUESTS = 10; 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(); @Nullable Loading Loading @@ -657,6 +675,10 @@ public final class ContentCaptureManagerService extends if (mPackagesWithShareRequests.size() >= MAX_CONCURRENT_FILE_SHARING_REQUESTS || mPackagesWithShareRequests.contains(request.getPackageName())) { try { String serviceName = mServiceNameResolver.getServiceName(userId); ContentCaptureMetricsLogger.writeServiceEvent( EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST, serviceName, request.getPackageName()); clientAdapter.error( ContentCaptureManager.DATA_SHARE_ERROR_CONCURRENT_REQUEST); } catch (RemoteException e) { Loading Loading @@ -920,6 +942,7 @@ public final class ContentCaptureManagerService extends @NonNull private final DataShareRequest mDataShareRequest; @NonNull private final IDataShareWriteAdapter mClientAdapter; @NonNull private final ContentCaptureManagerService mParentService; @NonNull private final AtomicBoolean mLoggedWriteFinish = new AtomicBoolean(false); DataShareCallbackDelegate(@NonNull DataShareRequest dataShareRequest, @NonNull IDataShareWriteAdapter clientAdapter, Loading @@ -932,9 +955,12 @@ public final class ContentCaptureManagerService extends @Override public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException { 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(); if (clientPipe == null) { logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL); mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); return; Loading @@ -945,6 +971,8 @@ public final class ContentCaptureManagerService extends Pair<ParcelFileDescriptor, ParcelFileDescriptor> servicePipe = createPipe(); if (servicePipe == null) { logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL); bestEffortCloseFileDescriptors(sourceIn, sinkIn); mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); Loading Loading @@ -987,6 +1015,8 @@ public final class ContentCaptureManagerService extends } } catch (IOException 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, ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); Loading @@ -996,6 +1026,10 @@ public final class ContentCaptureManagerService extends .remove(mDataShareRequest.getPackageName()); } if (receivedData) { if (!mLoggedWriteFinish.get()) { logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED); mLoggedWriteFinish.set(true); } try { mClientAdapter.finish(); } catch (RemoteException e) { Loading @@ -1008,6 +1042,8 @@ public final class ContentCaptureManagerService extends } } else { // Client or service may have crashed before sending. logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_EMPTY_DATA); sendErrorSignal(mClientAdapter, serviceAdapter, ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); } Loading @@ -1027,6 +1063,7 @@ public final class ContentCaptureManagerService extends @Override public void reject() throws RemoteException { Slog.i(TAG, "Data share request rejected by Content Capture service"); logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__REJECT_DATA_SHARE_REQUEST); mClientAdapter.rejected(); } Loading @@ -1048,11 +1085,16 @@ public final class ContentCaptureManagerService extends && !sourceOut.getFileDescriptor().valid(); if (finishedSuccessfully) { if (!mLoggedWriteFinish.get()) { logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED); mLoggedWriteFinish.set(true); } Slog.i(TAG, "Content capture data sharing session terminated " + "successfully for package '" + mDataShareRequest.getPackageName() + "'"); } else { logServiceEvent(EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED); Slog.i(TAG, "Reached the timeout of Content Capture data sharing session " + "for package '" + mDataShareRequest.getPackageName() Loading Loading @@ -1123,5 +1165,12 @@ public final class ContentCaptureManagerService extends 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()); } } } services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java +3 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,9 @@ final class RemoteContentCaptureService public void onDataShareRequest(@NonNull DataShareRequest request, @NonNull IDataShareCallback.Stub dataShareCallback) { scheduleAsyncRequest((s) -> s.onDataShared(request, dataShareCallback)); writeServiceEvent( FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ON_DATA_SHARE_REQUEST, mComponentName, request.getPackageName()); } /** Loading Loading
services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +49 −0 Original line number Diff line number Diff line Loading @@ -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.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 android.annotation.NonNull; Loading Loading @@ -95,6 +104,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; /** * A service used to observe the contents of the screen. Loading @@ -114,6 +124,14 @@ public final class ContentCaptureManagerService extends private static final int MAX_CONCURRENT_FILE_SHARING_REQUESTS = 10; 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(); @Nullable Loading Loading @@ -657,6 +675,10 @@ public final class ContentCaptureManagerService extends if (mPackagesWithShareRequests.size() >= MAX_CONCURRENT_FILE_SHARING_REQUESTS || mPackagesWithShareRequests.contains(request.getPackageName())) { try { String serviceName = mServiceNameResolver.getServiceName(userId); ContentCaptureMetricsLogger.writeServiceEvent( EVENT__DATA_SHARE_ERROR_CONCURRENT_REQUEST, serviceName, request.getPackageName()); clientAdapter.error( ContentCaptureManager.DATA_SHARE_ERROR_CONCURRENT_REQUEST); } catch (RemoteException e) { Loading Loading @@ -920,6 +942,7 @@ public final class ContentCaptureManagerService extends @NonNull private final DataShareRequest mDataShareRequest; @NonNull private final IDataShareWriteAdapter mClientAdapter; @NonNull private final ContentCaptureManagerService mParentService; @NonNull private final AtomicBoolean mLoggedWriteFinish = new AtomicBoolean(false); DataShareCallbackDelegate(@NonNull DataShareRequest dataShareRequest, @NonNull IDataShareWriteAdapter clientAdapter, Loading @@ -932,9 +955,12 @@ public final class ContentCaptureManagerService extends @Override public void accept(@NonNull IDataShareReadAdapter serviceAdapter) throws RemoteException { 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(); if (clientPipe == null) { logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_CLIENT_PIPE_FAIL); mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); serviceAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); return; Loading @@ -945,6 +971,8 @@ public final class ContentCaptureManagerService extends Pair<ParcelFileDescriptor, ParcelFileDescriptor> servicePipe = createPipe(); if (servicePipe == null) { logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_SERVICE_PIPE_FAIL); bestEffortCloseFileDescriptors(sourceIn, sinkIn); mClientAdapter.error(ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); Loading Loading @@ -987,6 +1015,8 @@ public final class ContentCaptureManagerService extends } } catch (IOException 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, ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); Loading @@ -996,6 +1026,10 @@ public final class ContentCaptureManagerService extends .remove(mDataShareRequest.getPackageName()); } if (receivedData) { if (!mLoggedWriteFinish.get()) { logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED); mLoggedWriteFinish.set(true); } try { mClientAdapter.finish(); } catch (RemoteException e) { Loading @@ -1008,6 +1042,8 @@ public final class ContentCaptureManagerService extends } } else { // Client or service may have crashed before sending. logServiceEvent( CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__DATA_SHARE_ERROR_EMPTY_DATA); sendErrorSignal(mClientAdapter, serviceAdapter, ContentCaptureManager.DATA_SHARE_ERROR_UNKNOWN); } Loading @@ -1027,6 +1063,7 @@ public final class ContentCaptureManagerService extends @Override public void reject() throws RemoteException { Slog.i(TAG, "Data share request rejected by Content Capture service"); logServiceEvent(CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__REJECT_DATA_SHARE_REQUEST); mClientAdapter.rejected(); } Loading @@ -1048,11 +1085,16 @@ public final class ContentCaptureManagerService extends && !sourceOut.getFileDescriptor().valid(); if (finishedSuccessfully) { if (!mLoggedWriteFinish.get()) { logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED); mLoggedWriteFinish.set(true); } Slog.i(TAG, "Content capture data sharing session terminated " + "successfully for package '" + mDataShareRequest.getPackageName() + "'"); } else { logServiceEvent(EVENT__DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED); Slog.i(TAG, "Reached the timeout of Content Capture data sharing session " + "for package '" + mDataShareRequest.getPackageName() Loading Loading @@ -1123,5 +1165,12 @@ public final class ContentCaptureManagerService extends 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()); } } }
services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java +3 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,9 @@ final class RemoteContentCaptureService public void onDataShareRequest(@NonNull DataShareRequest request, @NonNull IDataShareCallback.Stub dataShareCallback) { scheduleAsyncRequest((s) -> s.onDataShared(request, dataShareCallback)); writeServiceEvent( FrameworkStatsLog.CONTENT_CAPTURE_SERVICE_EVENTS__EVENT__ON_DATA_SHARE_REQUEST, mComponentName, request.getPackageName()); } /** Loading