#pragma once #include #include "NativeModules.h" #include "JSValueTreeWriter.h" #include "CameraRotationHelper.h" #include "ReactCameraConstants.h" namespace winrt::ReactNativeCameraCPP { struct ReactCameraView : winrt::Windows::UI::Xaml::Controls::GridT { public: ReactCameraView() = default; ~ReactCameraView(); void SetContext(winrt::Microsoft::ReactNative::IReactContext const &reactContext); void Initialize(); void UpdateProperties(winrt::Microsoft::ReactNative::IJSValueReader const &propertyMapReader); winrt::Windows::Foundation::IAsyncAction TakePictureAsync(std::map const& options, winrt::Microsoft::ReactNative::ReactPromise &result); winrt::Windows::Foundation::IAsyncAction RecordAsync(std::map const& options, winrt::Microsoft::ReactNative::ReactPromise& result); public: static winrt::com_ptr Create(); private: void UpdateKeepAwake(bool keepAwake); void UpdateTorchMode(int torchMode); void UpdateFlashMode(int flashMode); void UpdateAspect(int aspect); fire_and_forget UpdateDeviceType(int type); winrt::Windows::Foundation::IAsyncAction InitializeAsync(); winrt::Windows::Foundation::IAsyncAction CleanupMediaCaptureAsync(); winrt::Windows::Foundation::IAsyncOperation FindCameraDeviceByPanelAsync(); winrt::Windows::Foundation::IAsyncOperation GetBase64DataAsync(winrt::Windows::Storage::Streams::IRandomAccessStream stream); winrt::Windows::Foundation::IAsyncOperation GetOutputStorageFileAsync(int type, int target); winrt::Windows::Foundation::IAsyncAction DelayStopRecording(int totalRecordingInSecs); winrt::Windows::Foundation::IAsyncAction WaitAndStopRecording(); winrt::Windows::Foundation::IAsyncAction UpdatePreviewOrientationAsync(); winrt::Windows::Foundation::IAsyncAction UpdateFilePropertiesAsync(winrt::Windows::Storage::StorageFile storageFile, std::map const& options); void OnOrientationChanged(const bool updatePreview); void OnApplicationSuspending(); void OnApplicationResuming(); winrt::Windows::Foundation::IAsyncAction OnUnloaded(); bool TryGetValueAsInt(std::map const& options, const std::wstring key, int& value); winrt::Microsoft::ReactNative::IReactContext m_reactContext{ nullptr }; winrt::Windows::UI::Xaml::Controls::CaptureElement m_childElement; handle m_signal{ CreateEvent(nullptr, true, false, nullptr) }; winrt::Windows::Media::Capture::LowLagMediaRecording m_mediaRecording{ nullptr}; winrt::ReactNativeCameraCPP::CameraRotationHelper m_rotationHelper{nullptr}; winrt::Windows::System::Display::DisplayRequest m_displayRequest{ nullptr }; winrt::event_token m_rotationEventToken{}; winrt::Windows::UI::Xaml::Application::Suspending_revoker m_applicationSuspendingEventToken; winrt::Windows::UI::Xaml::Application::Resuming_revoker m_applicationResumingEventToken; winrt::Windows::UI::Xaml::FrameworkElement::Unloaded_revoker m_unloadedEventToken; bool m_isInitialized{ false }; bool m_keepAwake{ false }; int m_torchMode{ ReactCameraContants::CameraTorchModeOff }; int m_flashMode{ ReactCameraContants::CameraFlashModeOff }; winrt::Windows::Devices::Enumeration::Panel m_panelType{ winrt::Windows::Devices::Enumeration::Panel::Unknown }; }; } // namespace winrt::ReactNativeVideoCPP