cameraservice: Log session index

For tracking camera performance, it is helpful to know the order in
which camera sessions were created.

This CL adds a sessionIndex field to CameraSessionStats which tracks
the order in which sessions were created. This field is logged by
ICameraServiceProxy.

Bug: 236318755
Test: No functional change.
      `atest CtsCameraTestCases` passes
Change-Id: I5a5accdb2fd3d1de6e7ec31f3e67faaeccb0d3dc
diff --git a/core/java/android/hardware/CameraSessionStats.java b/core/java/android/hardware/CameraSessionStats.java
index 79a551a..d59295e 100644
--- a/core/java/android/hardware/CameraSessionStats.java
+++ b/core/java/android/hardware/CameraSessionStats.java
@@ -64,6 +64,7 @@
     private ArrayList<CameraStreamStats> mStreamStats;
     private String mUserTag;
     private int mVideoStabilizationMode;
+    private int mSessionIndex;
 
     public CameraSessionStats() {
         mFacing = -1;
@@ -80,11 +81,13 @@
         mDeviceError = false;
         mStreamStats = new ArrayList<CameraStreamStats>();
         mVideoStabilizationMode = -1;
+        mSessionIndex = 0;
     }
 
     public CameraSessionStats(String cameraId, int facing, int newCameraState,
             String clientName, int apiLevel, boolean isNdk, int creationDuration,
-            float maxPreviewFps, int sessionType, int internalReconfigure, long logId) {
+            float maxPreviewFps, int sessionType, int internalReconfigure, long logId,
+            int sessionIdx) {
         mCameraId = cameraId;
         mFacing = facing;
         mNewCameraState = newCameraState;
@@ -97,6 +100,7 @@
         mSessionType = sessionType;
         mInternalReconfigure = internalReconfigure;
         mStreamStats = new ArrayList<CameraStreamStats>();
+        mSessionIndex = sessionIdx;
     }
 
     public static final @android.annotation.NonNull Parcelable.Creator<CameraSessionStats> CREATOR =
@@ -140,6 +144,7 @@
         dest.writeTypedList(mStreamStats);
         dest.writeString(mUserTag);
         dest.writeInt(mVideoStabilizationMode);
+        dest.writeInt(mSessionIndex);
     }
 
     public void readFromParcel(Parcel in) {
@@ -164,6 +169,7 @@
 
         mUserTag = in.readString();
         mVideoStabilizationMode = in.readInt();
+        mSessionIndex = in.readInt();
     }
 
     public String getCameraId() {
@@ -233,4 +239,8 @@
     public int getVideoStabilizationMode() {
         return mVideoStabilizationMode;
     }
+
+    public int getSessionIndex() {
+        return mSessionIndex;
+    }
 }
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index e8af840..0315352 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -244,12 +244,13 @@
         public String mUserTag;
         public int mVideoStabilizationMode;
         public final long mLogId;
+        public final int mSessionIndex;
 
         private long mDurationOrStartTimeMs;  // Either start time, or duration once completed
 
         CameraUsageEvent(String cameraId, int facing, String clientName, int apiLevel,
                 boolean isNdk, int action, int latencyMs, int operatingMode, boolean deviceError,
-                long logId) {
+                long logId, int sessionIdx) {
             mCameraId = cameraId;
             mCameraFacing = facing;
             mClientName = clientName;
@@ -262,6 +263,7 @@
             mOperatingMode = operatingMode;
             mDeviceError = deviceError;
             mLogId = logId;
+            mSessionIndex = sessionIdx;
         }
 
         public void markCompleted(int internalReconfigure, long requestCount,
@@ -844,7 +846,8 @@
                         + ", streamCount is " + streamCount
                         + ", userTag is " + e.mUserTag
                         + ", videoStabilizationMode " + e.mVideoStabilizationMode
-                        + ", logId " + e.mLogId);
+                        + ", logId " + e.mLogId
+                        + ", sessionIndex " + e.mSessionIndex);
             }
             // Convert from CameraStreamStats to CameraStreamProto
             CameraStreamProto[] streamProtos = new CameraStreamProto[MAX_STREAM_STATISTICS];
@@ -904,7 +907,7 @@
                     MessageNano.toByteArray(streamProtos[2]),
                     MessageNano.toByteArray(streamProtos[3]),
                     MessageNano.toByteArray(streamProtos[4]),
-                    e.mUserTag, e.mVideoStabilizationMode, e.mLogId);
+                    e.mUserTag, e.mVideoStabilizationMode, e.mLogId, e.mSessionIndex);
         }
     }
 
@@ -1094,6 +1097,7 @@
         String userTag = cameraState.getUserTag();
         int videoStabilizationMode = cameraState.getVideoStabilizationMode();
         long logId = cameraState.getLogId();
+        int sessionIdx = cameraState.getSessionIndex();
         synchronized(mLock) {
             // Update active camera list and notify NFC if necessary
             boolean wasEmpty = mActiveCameraUsage.isEmpty();
@@ -1115,7 +1119,7 @@
                     CameraUsageEvent openEvent = new CameraUsageEvent(
                             cameraId, facing, clientName, apiLevel, isNdk,
                             FrameworkStatsLog.CAMERA_ACTION_EVENT__ACTION__OPEN,
-                            latencyMs, sessionType, deviceError, logId);
+                            latencyMs, sessionType, deviceError, logId, sessionIdx);
                     mCameraUsageHistory.add(openEvent);
                     break;
                 case CameraSessionStats.CAMERA_STATE_ACTIVE:
@@ -1142,7 +1146,7 @@
                     CameraUsageEvent newEvent = new CameraUsageEvent(
                             cameraId, facing, clientName, apiLevel, isNdk,
                             FrameworkStatsLog.CAMERA_ACTION_EVENT__ACTION__SESSION,
-                            latencyMs, sessionType, deviceError, logId);
+                            latencyMs, sessionType, deviceError, logId, sessionIdx);
                     CameraUsageEvent oldEvent = mActiveCameraUsage.put(cameraId, newEvent);
                     if (oldEvent != null) {
                         Slog.w(TAG, "Camera " + cameraId + " was already marked as active");
@@ -1186,7 +1190,7 @@
                         CameraUsageEvent closeEvent = new CameraUsageEvent(
                                 cameraId, facing, clientName, apiLevel, isNdk,
                                 FrameworkStatsLog.CAMERA_ACTION_EVENT__ACTION__CLOSE,
-                                latencyMs, sessionType, deviceError, logId);
+                                latencyMs, sessionType, deviceError, logId, sessionIdx);
                         mCameraUsageHistory.add(closeEvent);
                     }