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