Add westworld logging for CCAPI data share
Bug: 158295023
Fixes: 158295023
Test: ran cts tests
Change-Id: I8309404452a45291650735be9da76a8b08c6dcb6
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 13e5ab4..4a4b7dd 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -26,6 +26,15 @@
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;
@@ -95,6 +104,7 @@
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.
@@ -114,6 +124,14 @@
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
@@ -657,6 +675,10 @@
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) {
@@ -920,6 +942,7 @@
@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,
@@ -932,9 +955,12 @@
@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;
@@ -945,6 +971,8 @@
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);
@@ -987,6 +1015,8 @@
}
} 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);
@@ -996,6 +1026,10 @@
.remove(mDataShareRequest.getPackageName());
}
if (receivedData) {
+ if (!mLoggedWriteFinish.get()) {
+ logServiceEvent(EVENT__DATA_SHARE_WRITE_FINISHED);
+ mLoggedWriteFinish.set(true);
+ }
try {
mClientAdapter.finish();
} catch (RemoteException e) {
@@ -1008,6 +1042,8 @@
}
} 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);
}
@@ -1027,6 +1063,7 @@
@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();
}
@@ -1048,11 +1085,16 @@
&& !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()
@@ -1123,5 +1165,12 @@
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());
+ }
}
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
index 0b9bf39..08e6a05 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
@@ -156,6 +156,9 @@
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());
}
/**