1 /* 2 * Copyright 2023 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.testing.impl.fakes; 18 19 import androidx.annotation.RestrictTo; 20 import androidx.camera.core.CameraInfo; 21 import androidx.camera.core.CameraSelector; 22 import androidx.camera.core.concurrent.CameraCoordinator; 23 24 import org.jspecify.annotations.NonNull; 25 import org.jspecify.annotations.Nullable; 26 27 import java.util.ArrayList; 28 import java.util.HashMap; 29 import java.util.List; 30 import java.util.Map; 31 32 /** 33 * A {@link CameraCoordinator} implementation that contains concurrent camera mode and camera id 34 * information. 35 * 36 */ 37 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 38 public class FakeCameraCoordinator implements CameraCoordinator { 39 40 private @NonNull Map<String, String> mConcurrentCameraIdMap; 41 private @NonNull List<List<String>> mConcurrentCameraIds; 42 private @NonNull List<List<CameraSelector>> mConcurrentCameraSelectors; 43 private @NonNull List<CameraInfo> mActiveConcurrentCameraInfos; 44 private final @NonNull List<ConcurrentCameraModeListener> mConcurrentCameraModeListeners; 45 46 @CameraOperatingMode private int mCameraOperatingMode; 47 FakeCameraCoordinator()48 public FakeCameraCoordinator() { 49 mConcurrentCameraIdMap = new HashMap<>(); 50 mConcurrentCameraIds = new ArrayList<>(); 51 mConcurrentCameraSelectors = new ArrayList<>(); 52 mActiveConcurrentCameraInfos = new ArrayList<>(); 53 mConcurrentCameraModeListeners = new ArrayList<>(); 54 } 55 56 /** 57 * Adds concurrent camera id and camera selectors. 58 * 59 * @param cameraIdAndSelectors combinations of camera id and selector. 60 */ addConcurrentCameraIdsAndCameraSelectors( @onNull Map<String, CameraSelector> cameraIdAndSelectors)61 public void addConcurrentCameraIdsAndCameraSelectors( 62 @NonNull Map<String, CameraSelector> cameraIdAndSelectors) { 63 mConcurrentCameraIds.add(new ArrayList<>(cameraIdAndSelectors.keySet())); 64 mConcurrentCameraSelectors.add(new ArrayList<>(cameraIdAndSelectors.values())); 65 66 for (List<String> concurrentCameraIdList: mConcurrentCameraIds) { 67 List<String> cameraIdList = new ArrayList<>(concurrentCameraIdList); 68 mConcurrentCameraIdMap.put(cameraIdList.get(0), cameraIdList.get(1)); 69 mConcurrentCameraIdMap.put(cameraIdList.get(1), cameraIdList.get(0)); 70 } 71 } 72 73 @Override getConcurrentCameraSelectors()74 public @NonNull List<List<CameraSelector>> getConcurrentCameraSelectors() { 75 return mConcurrentCameraSelectors; 76 } 77 78 @Override getActiveConcurrentCameraInfos()79 public @NonNull List<CameraInfo> getActiveConcurrentCameraInfos() { 80 return mActiveConcurrentCameraInfos; 81 } 82 83 @Override setActiveConcurrentCameraInfos(@onNull List<CameraInfo> cameraInfos)84 public void setActiveConcurrentCameraInfos(@NonNull List<CameraInfo> cameraInfos) { 85 mActiveConcurrentCameraInfos = cameraInfos; 86 } 87 88 @Override getPairedConcurrentCameraId(@onNull String cameraId)89 public @Nullable String getPairedConcurrentCameraId(@NonNull String cameraId) { 90 if (mConcurrentCameraIdMap.containsKey(cameraId)) { 91 return mConcurrentCameraIdMap.get(cameraId); 92 } 93 return null; 94 } 95 96 @CameraOperatingMode 97 @Override getCameraOperatingMode()98 public int getCameraOperatingMode() { 99 return mCameraOperatingMode; 100 } 101 102 @Override setCameraOperatingMode(@ameraOperatingMode int cameraOperatingMode)103 public void setCameraOperatingMode(@CameraOperatingMode int cameraOperatingMode) { 104 if (cameraOperatingMode != mCameraOperatingMode) { 105 for (ConcurrentCameraModeListener listener : mConcurrentCameraModeListeners) { 106 listener.onCameraOperatingModeUpdated( 107 mCameraOperatingMode, 108 cameraOperatingMode); 109 } 110 } 111 112 mCameraOperatingMode = cameraOperatingMode; 113 } 114 115 @Override addListener(@onNull ConcurrentCameraModeListener listener)116 public void addListener(@NonNull ConcurrentCameraModeListener listener) { 117 mConcurrentCameraModeListeners.add(listener); 118 } 119 120 @Override removeListener(@onNull ConcurrentCameraModeListener listener)121 public void removeListener(@NonNull ConcurrentCameraModeListener listener) { 122 mConcurrentCameraModeListeners.remove(listener); 123 } 124 125 @Override shutdown()126 public void shutdown() { 127 mConcurrentCameraIdMap.clear(); 128 mConcurrentCameraIds.clear(); 129 mConcurrentCameraSelectors.clear(); 130 mActiveConcurrentCameraInfos.clear(); 131 mConcurrentCameraModeListeners.clear(); 132 } 133 } 134