Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 341bf453 authored by Dorin Drimus's avatar Dorin Drimus Committed by Android (Google) Code Review
Browse files

Merge "Add CaptureResultBuilder" into main

parents 1ed3ca55 999d65eb
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -3742,10 +3742,17 @@ package android.companion.virtual.camera {
    ctor public CameraCharacteristicsBuilder(@NonNull android.hardware.camera2.CameraCharacteristics);
    method @NonNull public android.hardware.camera2.CameraCharacteristics build();
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder set(@NonNull android.hardware.camera2.CameraCharacteristics.Key<T>, T);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureResultKeys(@Nullable java.util.List<android.hardware.camera2.CaptureResult.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(@Nullable java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableSessionKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
    method @NonNull public android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
    method @NonNull public android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureResultKeys(@Nullable java.util.List<android.hardware.camera2.CaptureResult.Key<?>>);
    method @NonNull public android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(@Nullable java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>>);
    method @NonNull public android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableSessionKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
  }
  @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public final class CaptureResultBuilder {
    ctor public CaptureResultBuilder();
    ctor public CaptureResultBuilder(@NonNull android.hardware.camera2.CaptureResult);
    method @NonNull public android.hardware.camera2.CaptureResult build();
    method @NonNull public <T> android.companion.virtual.camera.CaptureResultBuilder set(@NonNull android.hardware.camera2.CaptureResult.Key<T>, T);
  }
  public final class VirtualCamera implements java.io.Closeable {
+4 −4
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ public final class CameraCharacteristicsBuilder {
     */
    @SuppressLint("MissingGetterMatchingBuilder") // the getter method is getKeys()
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(
    public CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(
            @Nullable List<CameraCharacteristics.Key<?>> availableCharacteristicsKeys) {
        int[] characteristicsTags = null;
        if (availableCharacteristicsKeys != null) {
@@ -129,7 +129,7 @@ public final class CameraCharacteristicsBuilder {
     * Sets the {@link CaptureRequest.Key}s available for the {@link CaptureRequest}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(
    public CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(
            @Nullable List<CaptureRequest.Key<?>> availableCaptureRequestKeys) {
        int[] captureRequestTags = null;
        if (availableCaptureRequestKeys != null) {
@@ -148,7 +148,7 @@ public final class CameraCharacteristicsBuilder {
     * Sets the {@link CaptureResult.Key}s available for the {@link CaptureResult}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCaptureResultKeys(
    public CameraCharacteristicsBuilder setAvailableCaptureResultKeys(
            @Nullable List<CaptureResult.Key<?>> availableCaptureResultKeys) {
        int[] captureResultTags = null;
        if (availableCaptureResultKeys != null) {
@@ -166,7 +166,7 @@ public final class CameraCharacteristicsBuilder {
     * Sets the {@link CaptureRequest.Key}s available for the {@link SessionConfiguration}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableSessionKeys(
    public CameraCharacteristicsBuilder setAvailableSessionKeys(
            @Nullable List<CaptureRequest.Key<?>> availableSessionKeys) {
        int[] sessionTags = null;
        if (availableSessionKeys != null) {
+85 −0
Original line number Diff line number Diff line
/*
 * Copyright 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.companion.virtual.camera;

import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.impl.CameraMetadataNative;

import java.util.function.ObjLongConsumer;

/**
 * Builder class for creating {@link CaptureResult} instances to be passed to the Consumer from
 * {@link VirtualCameraCallback#onConfigureSession(VirtualCameraSessionConfig, ObjLongConsumer)}.
 *
 * @hide
 */
// There is no CaptureResult.Builder for now, so this helps VDM clients to build CaptureResult
// instances to be passed to the VirtualCameraService. Only the native metadata part is passed
// to the virtual camera service, the parent CaptureRequest is not used
@SuppressLint("TopLevelBuilder")
@SystemApi
@FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_VIRTUAL_CAMERA_METADATA)
public final class CaptureResultBuilder {
    private final CameraMetadataNative mNativeMetadata;

    /**
     * Builder for creating a {@link CaptureResult}.
     *
     * @see CameraCharacteristics#getAvailableCaptureResultKeys
     */
    public CaptureResultBuilder() {
        mNativeMetadata = new CameraMetadataNative();
    }

    /**
     * Builder for creating a {@link CaptureResult} starting from a copy of an existing instance.
     */
    public CaptureResultBuilder(@NonNull CaptureResult captureResult) {
        mNativeMetadata = new CameraMetadataNative(captureResult.getNativeMetadata());
    }

    /**
     * Set a capture result field to a value. The field definitions can be found in
     * {@link CaptureResult}.
     * <p>
     * Setting a field to {@code null} will remove that field from the capture result metadata.
     *
     * @param key   The metadata field to write.
     * @param value The value to set the field to, which must be of a matching type to the key.
     */
    @SuppressLint("KotlinOperator")
    @NonNull
    public <T> CaptureResultBuilder set(@NonNull CaptureResult.Key<T> key, T value) {
        mNativeMetadata.set(key, value);
        return this;
    }

    /**
     * Builds the {@link CaptureResult} object with the set of {@link CaptureResult.Key}s.
     *
     * @return A new {@link CaptureResult} instance to be consumed by a Virtual Camera.
     */
    public @NonNull CaptureResult build() {
        // cameraId, captureRequest, requestId and frameNumber are not used
        return new CaptureResult(mNativeMetadata, 0 /* requestId */);
    }
}