CameraITS: add query camera characteristics by ID command

Bug: 73378901
Change-Id: I834c1d1989a985220742502a290a6e435bc5dc0f
diff --git a/apps/CameraITS/pymodules/its/device.py b/apps/CameraITS/pymodules/its/device.py
index 4f35b7a..4fc5fe7 100644
--- a/apps/CameraITS/pymodules/its/device.py
+++ b/apps/CameraITS/pymodules/its/device.py
@@ -386,6 +386,26 @@
         self.props = data['objValue']['cameraProperties']
         return data['objValue']['cameraProperties']
 
+    def get_camera_properties_by_id(self, camera_id):
+        """Get the camera properties object for device with camera_id
+
+        Args:
+            camera_id: The ID string of the camera
+
+        Returns:
+            The Python dictionary object for the CameraProperties object. Empty
+            if no such device exists.
+
+        """
+        cmd = {}
+        cmd["cmdName"] = "getCameraPropertiesById"
+        cmd["cameraId"] = camera_id
+        self.sock.send(json.dumps(cmd) + "\n")
+        data,_ = self.__read_response_from_socket()
+        if data['tag'] != 'cameraProperties':
+            raise its.error.Error('Invalid command response')
+        return data['objValue']['cameraProperties']
+
     def do_3a(self, regions_ae=[[0,0,1,1,1]],
                     regions_awb=[[0,0,1,1,1]],
                     regions_af=[[0,0,1,1,1]],
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index 6b8e9b2..5dbbc79 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -650,6 +650,8 @@
                     closeCameraDevice();
                 } else if ("getCameraProperties".equals(cmdObj.getString("cmdName"))) {
                     doGetProps();
+                } else if ("getCameraPropertiesById".equals(cmdObj.getString("cmdName"))) {
+                    doGetPropsById(cmdObj);
                 } else if ("startSensorEvents".equals(cmdObj.getString("cmdName"))) {
                     doStartSensorEvents();
                 } else if ("getSensorEvents".equals(cmdObj.getString("cmdName"))) {
@@ -880,6 +882,34 @@
         mSocketRunnableObj.sendResponse(mCameraCharacteristics);
     }
 
+    private void doGetPropsById(JSONObject params) throws ItsException {
+        String[] devices;
+        try {
+            devices = mCameraManager.getCameraIdList();
+            if (devices == null || devices.length == 0) {
+                throw new ItsException("No camera devices");
+            }
+        } catch (CameraAccessException e) {
+            throw new ItsException("Failed to get device ID list", e);
+        }
+
+        try {
+            String cameraId = params.getString("cameraId");
+            if (Arrays.asList(devices).contains(cameraId)) {
+                CameraCharacteristics characteristics =
+                        mCameraManager.getCameraCharacteristics(cameraId);
+                mSocketRunnableObj.sendResponse(characteristics);
+            } else {
+                Log.e(TAG, "Invalid camera ID: " + cameraId);
+                throw new ItsException("Invalid cameraId:" + cameraId);
+            }
+        } catch (org.json.JSONException e) {
+            throw new ItsException("JSON error: ", e);
+        } catch (CameraAccessException e) {
+            throw new ItsException("Access error: ", e);
+        }
+    }
+
     private void doGetCameraIds() throws ItsException {
         String[] devices;
         try {