1 /*
2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.virtualdevice.cts.camera.util;
18 
19 import androidx.annotation.NonNull;
20 
21 import java.util.Objects;
22 
23 public class NativeCameraManager {
24     static {
25         System.loadLibrary("virtualcameratest-jni");
26     }
27     private final long mNativeCameraManagerPtr;
28 
NativeCameraManager()29     public NativeCameraManager() {
30         mNativeCameraManagerPtr = createCameraManager();
31     }
32 
33     @Override
finalize()34     protected void finalize() {
35         releaseCameraManager(mNativeCameraManagerPtr);
36     }
37 
38     /**
39      * Wraps ACameraManager_getCameraIdList NDK call.
40      *
41      * @return camera ids returned ACameraManager_getCameraIdList NDK call.
42      */
getCameraIds()43     public String[] getCameraIds() {
44         return getCameraIds(mNativeCameraManagerPtr);
45     }
46 
47     /**
48      * Calls ACameraManager_getCameraCharacteristics and returns value corresponding
49      * to INFO_DEVICE_ID key from camera characteristics.
50      *
51      * @param cameraId - camera id to fetch device id for.
52      * @return device id associated with the camera.
53      */
getDeviceId(String cameraId)54     public int getDeviceId(String cameraId) {
55         return getDeviceId(mNativeCameraManagerPtr, Objects.requireNonNull(cameraId));
56     }
57 
58     /**
59      * Corresponds to ACameraManager_registerAvailabilityCallbacks NDK call.
60      *
61      * @param callback implementation of {@code AvailabilityCallback} called when new camera becomes
62      *                 available / unavailable.
63      */
registerAvailabilityCallback(@onNull AvailabilityCallback callback)64     public void registerAvailabilityCallback(@NonNull AvailabilityCallback callback) {
65         registerAvailabilityCallback(mNativeCameraManagerPtr, Objects.requireNonNull(callback));
66     }
67 
68     public interface AvailabilityCallback {
69         /**
70          * Called when there's new camera available.
71          * @param cameraId - camera id of newly available camera.
72          */
onCameraAvailable(String cameraId)73         void onCameraAvailable(String cameraId);
74 
75         /**
76          * Called when camera becomes unavailable.
77          * @param cameraId - camera id of newly unavailable camera.
78          */
onCameraUnavailable(String cameraId)79         void onCameraUnavailable(String cameraId);
80     }
81 
createCameraManager()82     private static native long createCameraManager();
releaseCameraManager(long ptr)83     private static native void releaseCameraManager(long ptr);
getCameraIds(long ptr)84     private static native String[] getCameraIds(long ptr);
getDeviceId(long ptr, String cameraId)85     private static native int getDeviceId(long ptr, String cameraId);
registerAvailabilityCallback( long ptr, AvailabilityCallback callback)86     private static native void registerAvailabilityCallback(
87             long ptr, AvailabilityCallback callback);
88 }
89