1 /*
2  * Copyright 2020 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 @file:Suppress("UNCHECKED_CAST")
18 
19 package androidx.camera.camera2.pipe.testing
20 
21 import android.hardware.camera2.CameraCharacteristics
22 import android.hardware.camera2.CaptureRequest
23 import android.hardware.camera2.CaptureResult
24 import android.util.Size
25 import androidx.camera.camera2.pipe.CameraExtensionMetadata
26 import androidx.camera.camera2.pipe.CameraId
27 import androidx.camera.camera2.pipe.CameraMetadata
28 import androidx.camera.camera2.pipe.Metadata
29 import kotlin.reflect.KClass
30 
31 /** Utility class for interacting with objects that require pre-populated Metadata. */
32 public open class FakeMetadata(private val metadata: Map<Metadata.Key<*>, Any?> = emptyMap()) :
33     Metadata {
34     public companion object {
35         @JvmField public val TEST_KEY: Metadata.Key<Int> = Metadata.Key.create("test.key")
36 
37         @JvmField
38         public val TEST_KEY_ABSENT: Metadata.Key<Int> = Metadata.Key.create("test.key.absent")
39     }
40 
getnull41     override fun <T> get(key: Metadata.Key<T>): T? = metadata[key] as T?
42 
43     override fun <T> getOrDefault(key: Metadata.Key<T>, default: T): T {
44         val value = metadata[key]
45         return if (value == null) default else value as T
46     }
47 }
48 
49 /** Utility class for interacting with objects require specific [CameraCharacteristics] metadata. */
50 public class FakeCameraMetadata(
51     private val characteristics: Map<CameraCharacteristics.Key<*>, Any?> = emptyMap(),
52     metadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
53     cameraId: CameraId = FakeCameraIds.default,
54     override val keys: Set<CameraCharacteristics.Key<*>> = emptySet(),
55     override val requestKeys: Set<CaptureRequest.Key<*>> = emptySet(),
56     override val resultKeys: Set<CaptureResult.Key<*>> = emptySet(),
57     override val sessionKeys: Set<CaptureRequest.Key<*>> = emptySet(),
58     public val physicalMetadata: Map<CameraId, CameraMetadata> = emptyMap(),
59     override val physicalRequestKeys: Set<CaptureRequest.Key<*>> = emptySet(),
60     private val extensions: Map<Int, FakeCameraExtensionMetadata> = emptyMap(),
61 ) : FakeMetadata(metadata), CameraMetadata {
62 
getnull63     override fun <T> get(key: CameraCharacteristics.Key<T>): T? = characteristics[key] as T?
64 
65     override fun <T> getOrDefault(key: CameraCharacteristics.Key<T>, default: T): T =
66         get(key) ?: default
67 
68     override val camera: CameraId = cameraId
69     override val isRedacted: Boolean = false
70 
71     override val physicalCameraIds: Set<CameraId> = physicalMetadata.keys
72     override val supportedExtensions: Set<Int>
73         get() = extensions.keys
74 
75     override suspend fun getPhysicalMetadata(cameraId: CameraId): CameraMetadata =
76         physicalMetadata[cameraId]!!
77 
78     override fun awaitPhysicalMetadata(cameraId: CameraId): CameraMetadata =
79         physicalMetadata[cameraId]!!
80 
81     override suspend fun getExtensionMetadata(extension: Int): CameraExtensionMetadata {
82         return extensions[extension]!!
83     }
84 
awaitExtensionMetadatanull85     override fun awaitExtensionMetadata(extension: Int): CameraExtensionMetadata {
86         return extensions[extension]!!
87     }
88 
unwrapAsnull89     override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
90 
91     override fun toString(): String = "FakeCameraMetadata(camera: ${camera.value})"
92 }
93 
94 /** Utility class for interacting with objects require [CameraExtensionMetadata] */
95 public class FakeCameraExtensionMetadata(
96     override val camera: CameraId,
97     override val cameraExtension: Int,
98     metadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
99     private val characteristics: Map<CameraCharacteristics.Key<*>, Any?> = emptyMap(),
100     override val requestKeys: Set<CaptureRequest.Key<*>> = emptySet(),
101     override val resultKeys: Set<CaptureResult.Key<*>> = emptySet(),
102     private val captureOutputSizes: Map<Int, Set<Size>> = emptyMap(),
103     private val previewOutputSizes: Map<Class<*>, Set<Size>> = emptyMap(),
104     private val postviewSizes: Map<Int, Map<Size, Set<Size>>> = emptyMap(),
105     override val isRedacted: Boolean = false,
106     override val isPostviewSupported: Boolean = false,
107     override val isCaptureProgressSupported: Boolean = false
108 ) : FakeMetadata(metadata), CameraExtensionMetadata {
109     override fun getOutputSizes(imageFormat: Int): Set<Size> {
110         return captureOutputSizes[imageFormat] ?: emptySet()
111     }
112 
113     override fun getOutputSizes(klass: Class<*>): Set<Size> {
114         return previewOutputSizes[klass] ?: emptySet()
115     }
116 
117     override fun getPostviewSizes(captureSize: Size, format: Int): Set<Size> {
118         return postviewSizes[format]?.get(captureSize) ?: emptySet()
119     }
120 
121     override fun <T> get(key: CameraCharacteristics.Key<T>): T? = characteristics[key] as T?
122 
123     override fun <T> getOrDefault(key: CameraCharacteristics.Key<T>, default: T): T =
124         get(key) ?: default
125 
126     override val keys: Set<CameraCharacteristics.Key<*>>
127         get() = characteristics.keys
128 
129     override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
130 
131     override fun toString(): String =
132         "FakeCameraExtensionMetadata(camera: ${camera.value}, extension: $cameraExtension)"
133 }
134