CameraServiceProxy: Add client API level to log metrics

The camera client API level needs to be part of the log
metrics.

Bug: 68653614
Test: Manual using application
Change-Id: I5dd250e956e9509228b04ca45cf9ab14a2e87c21
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index c56002e..f87dbb5 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5328,6 +5328,11 @@
     // OS: P
     PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1321;
 
+    // FIELD: The camera API level used.
+    // CATEGORY: CAMERA
+    // OS: P
+    FIELD_CAMERA_API_LEVEL = 1322;
+
     // ---- End P Constants, all P constants go above this line ----
     // Add new aosp constants above this line.
     // END OF AOSP CONSTANTS
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 3133a51..ca8823f 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -103,13 +103,15 @@
     private static class CameraUsageEvent {
         public final int mCameraFacing;
         public final String mClientName;
+        public final int mAPILevel;
 
         private boolean mCompleted;
         private long mDurationOrStartTimeMs;  // Either start time, or duration once completed
 
-        public CameraUsageEvent(int facing, String clientName) {
+        public CameraUsageEvent(int facing, String clientName, int apiLevel) {
             mCameraFacing = facing;
             mClientName = clientName;
+            mAPILevel = apiLevel;
             mDurationOrStartTimeMs = SystemClock.elapsedRealtime();
             mCompleted = false;
         }
@@ -168,13 +170,13 @@
 
         @Override
         public void notifyCameraState(String cameraId, int newCameraState, int facing,
-                String clientName) {
+                String clientName, int apiLevel) {
             String state = cameraStateToString(newCameraState);
             String facingStr = cameraFacingToString(facing);
             if (DEBUG) Slog.v(TAG, "Camera " + cameraId + " facing " + facingStr + " state now " +
-                    state + " for client " + clientName);
+                    state + " for client " + clientName + " API Level " + apiLevel);
 
-            updateActivityCount(cameraId, newCameraState, facing, clientName);
+            updateActivityCount(cameraId, newCameraState, facing, clientName, apiLevel);
         }
     };
 
@@ -293,6 +295,7 @@
                         .setType(MetricsEvent.TYPE_ACTION)
                         .setSubtype(subtype)
                         .setLatency(e.getDuration())
+                        .addTaggedData(MetricsEvent.FIELD_CAMERA_API_LEVEL, e.mAPILevel)
                         .setPackageName(e.mClientName);
                 mLogger.write(l);
             }
@@ -368,7 +371,8 @@
         return true;
     }
 
-    private void updateActivityCount(String cameraId, int newCameraState, int facing, String clientName) {
+    private void updateActivityCount(String cameraId, int newCameraState, int facing,
+            String clientName, int apiLevel) {
         synchronized(mLock) {
             // Update active camera list and notify NFC if necessary
             boolean wasEmpty = mActiveCameraUsage.isEmpty();
@@ -376,7 +380,7 @@
                 case ICameraServiceProxy.CAMERA_STATE_OPEN:
                     break;
                 case ICameraServiceProxy.CAMERA_STATE_ACTIVE:
-                    CameraUsageEvent newEvent = new CameraUsageEvent(facing, clientName);
+                    CameraUsageEvent newEvent = new CameraUsageEvent(facing, clientName, apiLevel);
                     CameraUsageEvent oldEvent = mActiveCameraUsage.put(cameraId, newEvent);
                     if (oldEvent != null) {
                         Slog.w(TAG, "Camera " + cameraId + " was already marked as active");