Add westworld logging for CCAPI data share am: faf50e11cb am: 74da01288d
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11818613 Change-Id: Ic74aac1f373ee56f803d34065c2a18125fe80e58
This commit is contained in:
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user