1 /* 2 * Copyright (c) 2021-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef CAMERA_MANAGER_NAPI_H_ 17 #define CAMERA_MANAGER_NAPI_H_ 18 19 #include "camera_napi_utils.h" 20 #include "input/camera_device.h" 21 #include "input/camera_input_napi.h" 22 #include "input/camera_manager.h" 23 #include "listener_base.h" 24 #include "output/camera_output_capability.h" 25 #include "output/capture_output.h" 26 #include "output/photo_output_napi.h" 27 #include "output/preview_output_napi.h" 28 #include "output/video_output_napi.h" 29 #include "session/camera_session_napi.h" 30 31 namespace OHOS { 32 namespace CameraStandard { 33 static const char CAMERA_MANAGER_NAPI_CLASS_NAME[] = "CameraManager"; 34 35 enum CameraManagerAsyncCallbackModes { 36 CREATE_DEFERRED_PREVIEW_OUTPUT_ASYNC_CALLBACK, 37 }; 38 39 class CameraManagerCallbackNapi : public CameraManagerCallback, public ListenerBase, 40 public std::enable_shared_from_this<CameraManagerCallbackNapi> { 41 public: 42 explicit CameraManagerCallbackNapi(napi_env env); 43 virtual ~CameraManagerCallbackNapi(); 44 void OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const override; 45 void OnFlashlightStatusChanged(const std::string &cameraID, const FlashStatus flashStatus) const override; 46 47 private: 48 void OnCameraStatusCallback(const CameraStatusInfo &cameraStatusInfo) const; 49 void OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const; 50 }; 51 52 struct CameraStatusCallbackInfo { 53 CameraStatusInfo info_; 54 weak_ptr<const CameraManagerCallbackNapi> listener_; CameraStatusCallbackInfoCameraStatusCallbackInfo55 CameraStatusCallbackInfo(CameraStatusInfo info, shared_ptr<const CameraManagerCallbackNapi> listener) 56 : info_(info), listener_(listener) {} ~CameraStatusCallbackInfoCameraStatusCallbackInfo57 ~CameraStatusCallbackInfo() 58 { 59 listener_.reset(); 60 } 61 }; 62 63 class CameraMuteListenerNapi : public CameraMuteListener, public ListenerBase, 64 public std::enable_shared_from_this<CameraMuteListenerNapi> { 65 public: 66 explicit CameraMuteListenerNapi(napi_env env); 67 virtual ~CameraMuteListenerNapi(); 68 void OnCameraMute(bool muteMode) const override; 69 private: 70 void OnCameraMuteCallback(bool muteMode) const; 71 void OnCameraMuteCallbackAsync(bool muteMode) const; 72 }; 73 74 class ControlCenterStatusListenerNapi : public ControlCenterStatusListener, public ListenerBase, 75 public std::enable_shared_from_this<ControlCenterStatusListenerNapi> { 76 public: 77 explicit ControlCenterStatusListenerNapi(napi_env env); 78 virtual ~ControlCenterStatusListenerNapi(); 79 void OnControlCenterStatusChanged(bool status) const override; 80 private: 81 void OnControlCenterStatusCallback(bool status) const; 82 void OnControlCenterStatusCallbackAsync(bool status) const; 83 }; 84 85 struct ControlCenterStatusCallbackInfo { 86 bool controlCenterStatus_; 87 weak_ptr<const ControlCenterStatusListenerNapi> listener_; ControlCenterStatusCallbackInfoControlCenterStatusCallbackInfo88 ControlCenterStatusCallbackInfo(bool status, shared_ptr<const ControlCenterStatusListenerNapi> listener) 89 : controlCenterStatus_(status), listener_(listener) {} ~ControlCenterStatusCallbackInfoControlCenterStatusCallbackInfo90 ~ControlCenterStatusCallbackInfo() 91 { 92 listener_.reset(); 93 } 94 }; 95 96 struct CameraMuteCallbackInfo { 97 bool muteMode_; 98 weak_ptr<const CameraMuteListenerNapi> listener_; CameraMuteCallbackInfoCameraMuteCallbackInfo99 CameraMuteCallbackInfo(bool muteMode, shared_ptr<const CameraMuteListenerNapi> listener) 100 : muteMode_(muteMode), listener_(listener) {} ~CameraMuteCallbackInfoCameraMuteCallbackInfo101 ~CameraMuteCallbackInfo() 102 { 103 listener_.reset(); 104 } 105 }; 106 107 class TorchListenerNapi : public TorchListener, public ListenerBase, 108 public std::enable_shared_from_this<TorchListenerNapi> { 109 public: 110 explicit TorchListenerNapi(napi_env env); 111 virtual ~TorchListenerNapi(); 112 void OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const override; 113 private: 114 void OnTorchStatusChangeCallback(const TorchStatusInfo &torchStatusInfo) const; 115 void OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const; 116 }; 117 118 struct TorchStatusChangeCallbackInfo { 119 TorchStatusInfo info_; 120 weak_ptr<const TorchListenerNapi> listener_; TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo121 TorchStatusChangeCallbackInfo(TorchStatusInfo info, shared_ptr<const TorchListenerNapi> listener) 122 : info_(info), listener_(listener) {} ~TorchStatusChangeCallbackInfoTorchStatusChangeCallbackInfo123 ~TorchStatusChangeCallbackInfo() 124 { 125 listener_.reset(); 126 } 127 }; 128 129 class FoldListenerNapi : public FoldListener, public ListenerBase, 130 public std::enable_shared_from_this<FoldListenerNapi> { 131 public: 132 explicit FoldListenerNapi(napi_env env); 133 virtual ~FoldListenerNapi(); 134 void OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const override; 135 private: 136 void OnFoldStatusChangedCallback(const FoldStatusInfo &foldStatusInfo) const; 137 void OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const; 138 }; 139 140 struct FoldStatusChangeCallbackInfo { 141 FoldStatusInfo info_; 142 weak_ptr<const FoldListenerNapi> listener_; FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo143 FoldStatusChangeCallbackInfo(FoldStatusInfo info, shared_ptr<const FoldListenerNapi> listener) 144 : info_(info), listener_(listener) {} ~FoldStatusChangeCallbackInfoFoldStatusChangeCallbackInfo145 ~FoldStatusChangeCallbackInfo() 146 { 147 listener_.reset(); 148 } 149 }; 150 151 class CameraManagerNapi : public CameraNapiEventEmitter<CameraManagerNapi>, 152 public CameraNapiEventListener<TorchListenerNapi>, 153 public CameraNapiEventListener<CameraManagerCallbackNapi>, 154 public CameraNapiEventListener<CameraMuteListenerNapi>, 155 public CameraNapiEventListener<ControlCenterStatusListenerNapi>, 156 public CameraNapiEventListener<FoldListenerNapi> { 157 public: 158 static napi_value Init(napi_env env, napi_value exports); 159 static napi_value CreateCameraManager(napi_env env); 160 static napi_value GetSupportedCameras(napi_env env, napi_callback_info info); 161 static napi_value GetSupportedModes(napi_env env, napi_callback_info info); 162 static napi_value GetSupportedOutputCapability(napi_env env, napi_callback_info info); 163 static napi_value IsCameraMuted(napi_env env, napi_callback_info info); 164 static napi_value IsCameraMuteSupported(napi_env env, napi_callback_info info); 165 static napi_value MuteCamera(napi_env env, napi_callback_info info); 166 static napi_value MuteCameraPersist(napi_env env, napi_callback_info info); 167 static napi_value PrelaunchCamera(napi_env env, napi_callback_info info); 168 static napi_value ResetRssPriority(napi_env env, napi_callback_info info); 169 static napi_value PreSwitchCamera(napi_env env, napi_callback_info info); 170 static napi_value SetPrelaunchConfig(napi_env env, napi_callback_info info); 171 static napi_value IsPrelaunchSupported(napi_env env, napi_callback_info info); 172 static napi_value IsControlCenterActive(napi_env env, napi_callback_info info); 173 static napi_value CreateControlCenterSession(napi_env env, napi_callback_info info); 174 static napi_value CreateCameraInputInstance(napi_env env, napi_callback_info info); 175 static napi_value CreateCameraSessionInstance(napi_env env, napi_callback_info info); 176 static napi_value CreateSessionInstance(napi_env env, napi_callback_info info); 177 static napi_value CreatePreviewOutputInstance(napi_env env, napi_callback_info info); 178 static napi_value CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info); 179 static napi_value CreatePhotoOutputInstance(napi_env env, napi_callback_info info); 180 static napi_value CreateVideoOutputInstance(napi_env env, napi_callback_info info); 181 static napi_value CreateMetadataOutputInstance(napi_env env, napi_callback_info info); 182 static napi_value CreateDepthDataOutputInstance(napi_env env, napi_callback_info info); 183 static napi_value IsTorchSupported(napi_env env, napi_callback_info info); 184 static napi_value IsTorchModeSupported(napi_env env, napi_callback_info info); 185 static napi_value GetTorchMode(napi_env env, napi_callback_info info); 186 static napi_value SetTorchMode(napi_env env, napi_callback_info info); 187 static napi_value On(napi_env env, napi_callback_info info); 188 static napi_value Once(napi_env env, napi_callback_info info); 189 static napi_value Off(napi_env env, napi_callback_info info); 190 static napi_value GetCameraDevice(napi_env env, napi_callback_info info); 191 static napi_value GetCameraConcurrentInfos(napi_env env, napi_callback_info info); 192 static napi_value GetCameraStorageSize(napi_env env, napi_callback_info info); 193 194 CameraManagerNapi(); 195 ~CameraManagerNapi() override; 196 197 virtual const EmitterFunctions& GetEmitterFunctions() override; 198 199 private: 200 static void CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint); 201 static napi_value CameraManagerNapiConstructor(napi_env env, napi_callback_info info); 202 static void ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition, 203 const CameraType cameraType, sptr<CameraDevice>& cameraInfo); 204 static void GetSupportedOutputCapabilityAdaptNormalMode( 205 SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability); 206 static sptr<CameraDevice> GetSupportedOutputCapabilityGetCameraInfo( 207 napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode); 208 209 static void RemoveDuplicatesProfile(sptr<CameraOutputCapability>& outputCapability); 210 template<typename T> 211 static void RemoveDuplicatesProfile(std::vector<T>& profiles); 212 static napi_value CreateCameraConcurrentResult(napi_env env, vector<sptr<CameraDevice>> &cameraDeviceArrray, 213 std::vector<bool> &cameraConcurrentType, std::vector<std::vector<SceneMode>> &modes, 214 std::vector<std::vector<sptr<CameraOutputCapability>>> &outputCapabilities); 215 void ParseGetCameraConcurrentInfos(napi_env env, napi_value arrayParam, 216 std::vector<string> &cameraIdv); 217 218 void RegisterCameraStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 219 const std::vector<napi_value>& args, bool isOnce); 220 void UnregisterCameraStatusCallbackListener( 221 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 222 void RegisterCameraMuteCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 223 const std::vector<napi_value>& args, bool isOnce); 224 void UnregisterCameraMuteCallbackListener( 225 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 226 void RegisterTorchStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 227 const std::vector<napi_value>& args, bool isOnce); 228 void UnregisterTorchStatusCallbackListener( 229 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 230 void RegisterFoldStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 231 const std::vector<napi_value>& args, bool isOnce); 232 void UnregisterFoldStatusCallbackListener( 233 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 234 void RegisterControlCenterStatusCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 235 const std::vector<napi_value>& args, bool isOnce); 236 void UnregisterControlCenterStatusCallbackListener( 237 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 238 239 static thread_local napi_ref sConstructor_; 240 241 napi_env env_; 242 sptr<CameraManager> cameraManager_; 243 static thread_local uint32_t cameraManagerTaskId; 244 }; 245 246 struct CameraManagerAsyncContext : public AsyncContext { CameraManagerAsyncContextCameraManagerAsyncContext247 CameraManagerAsyncContext(std::string funcName, int32_t taskId) : AsyncContext(funcName, taskId) {}; 248 CameraManagerNapi* objectInfo = nullptr; 249 int64_t storageSize = 0; ~CameraManagerAsyncContextCameraManagerAsyncContext250 ~CameraManagerAsyncContext() 251 { 252 objectInfo = nullptr; 253 } 254 }; 255 } // namespace CameraStandard 256 } // namespace OHOS 257 #endif /* CAMERA_MANAGER_NAPI_H_ */ 258