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