1 /*
2  * Copyright 2025 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 androidx.camera.extensions.internal
18 
19 import android.content.Context
20 import android.hardware.camera2.CameraAccessException
21 import android.hardware.camera2.CameraExtensionCharacteristics
22 import android.hardware.camera2.CameraManager
23 import android.os.Build
24 import android.util.Log
25 import androidx.annotation.RequiresApi
26 import androidx.camera.core.CameraXConfig
27 import androidx.camera.core.CameraXConfig.ImplType
28 import androidx.camera.extensions.ExtensionMode
29 
30 /** The class to provide Camera2 Extensions related util methods. */
31 public object Camera2ExtensionsUtil {
32     private const val TAG = "Camera2ExtensionsUtil"
33 
34     /** Returns the Camera2 extension mode corresponding to the input CameraX extension mode. */
35     @RequiresApi(31)
convertCameraXModeToCamera2Modenull36     public fun convertCameraXModeToCamera2Mode(cameraXMode: Int): Int =
37         when (cameraXMode) {
38             ExtensionMode.BOKEH -> CameraExtensionCharacteristics.EXTENSION_BOKEH
39             ExtensionMode.HDR -> CameraExtensionCharacteristics.EXTENSION_HDR
40             ExtensionMode.NIGHT -> CameraExtensionCharacteristics.EXTENSION_NIGHT
41             ExtensionMode.FACE_RETOUCH -> CameraExtensionCharacteristics.EXTENSION_FACE_RETOUCH
42             ExtensionMode.AUTO -> CameraExtensionCharacteristics.EXTENSION_AUTOMATIC
43             else ->
44                 throw IllegalArgumentException("Unavailable CameraX extension mode ($cameraXMode)")
45         }
46 
47     /** Returns the CameraX extension mode corresponding to the input Camera2 extension mode. */
48     @RequiresApi(31)
convertCamera2ModeToCameraXModenull49     public fun convertCamera2ModeToCameraXMode(camera2Mode: Int): Int =
50         when (camera2Mode) {
51             CameraExtensionCharacteristics.EXTENSION_BOKEH -> ExtensionMode.BOKEH
52             CameraExtensionCharacteristics.EXTENSION_HDR -> ExtensionMode.HDR
53             CameraExtensionCharacteristics.EXTENSION_NIGHT -> ExtensionMode.NIGHT
54             CameraExtensionCharacteristics.EXTENSION_FACE_RETOUCH -> ExtensionMode.FACE_RETOUCH
55             CameraExtensionCharacteristics.EXTENSION_AUTOMATIC -> ExtensionMode.AUTO
56             else ->
57                 throw IllegalArgumentException("Unavailable Camera2 extension mode ($camera2Mode)")
58         }
59 
60     /** Creates the camera id to CameraExtensionCharacteristics map. */
61     @JvmStatic
createCameraId2CameraExtensionCharacteristicsMapnull62     public fun createCameraId2CameraExtensionCharacteristicsMap(
63         applicationContext: Context
64     ): Map<String, CameraExtensionCharacteristics> {
65         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
66             return emptyMap()
67         }
68 
69         return mutableMapOf<String, CameraExtensionCharacteristics>().apply {
70             try {
71                 val cameraManager = applicationContext.getSystemService(CameraManager::class.java)
72                 for (cameraId in cameraManager.cameraIdList) {
73                     put(cameraId, cameraManager.getCameraExtensionCharacteristics(cameraId))
74                 }
75             } catch (e: CameraAccessException) {
76                 Log.e(TAG, "Failed to retrieve CameraExtensionCharacteristics info. ", e)
77             }
78         }
79     }
80 
81     /** Returns true if Camera2 Extensions API should be be used to turn on the extension mode. */
82     @JvmStatic
shouldUseCamera2Extensionsnull83     public fun shouldUseCamera2Extensions(@ImplType configImplType: Int): Boolean =
84         configImplType == CameraXConfig.CAMERAX_CONFIG_IMPL_TYPE_PIPE
85 }
86