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 androidx.camera.camera2.pipe.testing
18
19 import android.hardware.camera2.CaptureRequest
20 import android.view.Surface
21 import androidx.camera.camera2.pipe.Metadata
22 import androidx.camera.camera2.pipe.Request
23 import androidx.camera.camera2.pipe.RequestMetadata
24 import androidx.camera.camera2.pipe.RequestNumber
25 import androidx.camera.camera2.pipe.RequestTemplate
26 import androidx.camera.camera2.pipe.StreamId
27 import kotlin.reflect.KClass
28 import kotlinx.atomicfu.atomic
29
30 private val fakeRequestNumbers = atomic(0L)
31
nextFakeRequestNumbernull32 internal fun nextFakeRequestNumber(): RequestNumber =
33 RequestNumber(fakeRequestNumbers.incrementAndGet())
34
35 /** Utility class for interacting with objects require specific [CaptureRequest] metadata. */
36 public class FakeRequestMetadata(
37 private val requestParameters: Map<CaptureRequest.Key<*>, Any?> = emptyMap(),
38 metadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
39 override val template: RequestTemplate = RequestTemplate(0),
40 override val streams: Map<StreamId, Surface> = mapOf(),
41 override val repeating: Boolean = false,
42 override val request: Request = Request(listOf()),
43 override val requestNumber: RequestNumber = nextFakeRequestNumber()
44 ) : FakeMetadata(request.extras.plus(metadata)), RequestMetadata {
45
46 @Suppress("UNCHECKED_CAST")
47 override fun <T> get(key: CaptureRequest.Key<T>): T? = requestParameters[key] as T?
48
49 override fun <T> getOrDefault(key: CaptureRequest.Key<T>, default: T): T = get(key) ?: default
50
51 override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
52
53 public companion object {
54 /** Initialize FakeRequestMetadata based on a specific [Request] object. */
55 public fun from(
56 request: Request,
57 streamToSurfaces: Map<StreamId, Surface>,
58 repeating: Boolean = false
59 ): FakeRequestMetadata {
60 check(streamToSurfaces.keys.containsAll(request.streams))
61 return FakeRequestMetadata(
62 requestParameters = request.parameters,
63 template = request.template ?: RequestTemplate(0),
64 streams = request.streams.associate { it to checkNotNull(streamToSurfaces[it]) },
65 repeating = repeating,
66 request = request
67 )
68 }
69 }
70
71 override fun toString(): String =
72 "FakeRequestMetadata(requestNumber: ${requestNumber.value}, request: $request)"
73 }
74