cameraservice: Add metrics for extension sessions

We want to log camera extension usage in cameraservice. This CL adds
the scaffolding for it. Specifically, it does the following:

  - Adds CameraExtensionSessionStats.aidl: This is used as the interface
    that CameraExtensionSession, CameraService, and CameraServiceProxy
    use to parcel extension metrics around.

  - Adds 'reportExtensionStats' to ICameraService: To keep the details
    of extensions away from cameraservice, CameraExtensionSession is
    responsible for collecting and reporting the stats. CameraService
    simply maps the reported stats to the current camera session and
    passes it to CameraServiceProxy when the session is closed.

    Some additional safeguards are added for this function because
    CameraExtensionSession can potentially report stats after the
    session has already been closed from cameraservice.

Bug: 261470491
Test: No functional change.
      `atest CtsCameraTestCases` passes.
      `statsd_testdrive 227` confirms that extension metrics are logged
          correctly.
Change-Id: I4a9897fc2b09cabb7618e94f8484757735c5e1f3
diff --git a/camera/CameraSessionStats.cpp b/camera/CameraSessionStats.cpp
index 3954db5..9e9793d 100644
--- a/camera/CameraSessionStats.cpp
+++ b/camera/CameraSessionStats.cpp
@@ -279,7 +279,8 @@
         mResultErrorCount(0),
         mDeviceError(false),
         mVideoStabilizationMode(-1),
-        mSessionIndex(0) {}
+        mSessionIndex(0),
+        mCameraExtensionSessionStats() {}
 
 CameraSessionStats::CameraSessionStats(const String16& cameraId,
         int facing, int newCameraState, const String16& clientName,
@@ -299,7 +300,8 @@
                 mResultErrorCount(0),
                 mDeviceError(0),
                 mVideoStabilizationMode(-1),
-                mSessionIndex(0) {}
+                mSessionIndex(0),
+                mCameraExtensionSessionStats() {}
 
 status_t CameraSessionStats::readFromParcel(const android::Parcel* parcel) {
     if (parcel == NULL) {
@@ -417,6 +419,12 @@
         return err;
     }
 
+    CameraExtensionSessionStats extStats{};
+    if ((err = extStats.readFromParcel(parcel)) != OK) {
+        ALOGE("%s: Failed to read extension session stats from parcel", __FUNCTION__);
+        return err;
+    }
+
     mCameraId = id;
     mFacing = facing;
     mNewCameraState = newCameraState;
@@ -435,6 +443,7 @@
     mUserTag = userTag;
     mVideoStabilizationMode = videoStabilizationMode;
     mSessionIndex = sessionIdx;
+    mCameraExtensionSessionStats = extStats;
 
     return OK;
 }
@@ -537,6 +546,11 @@
         return err;
     }
 
+    if ((err = mCameraExtensionSessionStats.writeToParcel(parcel)) != OK) {
+        ALOGE("%s: Failed to write extension sessions stats!", __FUNCTION__);
+        return err;
+    }
+
     return OK;
 }