react-native-camera/windows/ReactNativeCameraCPP/ReactCameraView.h
Jon Thysell 2782a24d25
feat(windows): added barcode scanning support (#2930)
Build:
* Fixed issue with edit and continue debug symbols
* Fixed ReactNativeCameraCPP61 builds
* Added dependency on huycn.zxingcpp.winrt for barcode support

ReactNativeCameraCPP RNCamera component:
* Added onBarCodeRead event support
* Added barCodeScannerEnabled property support
* Added barCodeTypes property support
* Added barCodeReadIntervalMS property to alter how often the scan
  occurs when enabled

ReactNativeCameraCPP RNCamera module:
* Added BarCodeType constants

Other:
* Fixed intermittent issue with thread marshalling
* Re-ran clang formatting

Closes #2830
2020-08-11 15:57:00 -03:00

138 lines
6.1 KiB
C++

#pragma once
#include "JSValue.h"
#include "NativeModules.h"
#include "CameraRotationHelper.h"
#include "ReactCameraConstants.h"
namespace winrt::ReactNativeCameraCPP {
struct ReactCameraView : winrt::Windows::UI::Xaml::Controls::GridT<ReactCameraView> {
public:
ReactCameraView() = default;
~ReactCameraView();
void SetContext(winrt::Microsoft::ReactNative::IReactContext const &reactContext);
void Initialize();
void UpdateProperties(winrt::Microsoft::ReactNative::IJSValueReader const &propertyMapReader) noexcept;
winrt::Windows::Foundation::IAsyncAction TakePictureAsync(
winrt::Microsoft::ReactNative::JSValueObject const &options,
winrt::Microsoft::ReactNative::ReactPromise<winrt::Microsoft::ReactNative::JSValueObject> const &result) noexcept;
winrt::Windows::Foundation::IAsyncAction RecordAsync(
winrt::Microsoft::ReactNative::JSValueObject const &options,
winrt::Microsoft::ReactNative::ReactPromise<winrt::Microsoft::ReactNative::JSValueObject> const &result) noexcept;
winrt::Windows::Foundation::IAsyncAction StopRecordAsync() noexcept;
winrt::Windows::Foundation::IAsyncAction IsRecordingAsync(
winrt::Microsoft::ReactNative::ReactPromise<bool> const &result) noexcept;
winrt::Windows::Foundation::IAsyncAction PausePreviewAsync() noexcept;
winrt::Windows::Foundation::IAsyncAction ResumePreviewAsync() noexcept;
public:
static winrt::com_ptr<ReactCameraView> Create();
private:
void UpdateKeepAwake(bool keepAwake);
void UpdateFlashMode(int flashMode);
void UpdateAutoFocus(int focusMode);
void UpdateWhiteBalance(int whiteBalance);
void UpdateMirrorVideo(bool mirrorVideo);
void UpdateAspect(int aspect);
void UpdateDefaultVideoQuality(int videoQuality);
void UpdateBarcodeScannerEnabled(bool barcodeScannerEnabled);
void UpdateBarcodeTypes(winrt::Microsoft::ReactNative::JSValueArray const &barcodeTypes);
void UpdateBarcodeReadIntervalMS(int barcodeReadIntervalMS);
fire_and_forget UpdateDeviceId(std::string cameraId);
fire_and_forget UpdateDeviceType(int type);
winrt::Windows::Foundation::IAsyncAction InitializeAsync();
winrt::Windows::Foundation::IAsyncAction UpdateMediaStreamPropertiesAsync();
winrt::Windows::Foundation::IAsyncAction UpdateMediaStreamPropertiesAsync(int videoQuality);
winrt::Windows::Foundation::IAsyncAction CleanupMediaCaptureAsync();
winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Devices::Enumeration::DeviceInformation>
FindCameraDeviceAsync();
winrt::Windows::Foundation::IAsyncOperation<winrt::hstring> GetBase64DataAsync(
winrt::Windows::Storage::Streams::IRandomAccessStream stream);
winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Storage::StorageFile> GetOutputStorageFileAsync(
int type,
int target);
void DelayStopRecording(float totalRecordingInSecs);
winrt::Windows::Foundation::IAsyncAction WaitAndStopRecording();
winrt::Windows::Foundation::IAsyncAction UpdatePreviewOrientationAsync();
winrt::Windows::Foundation::IAsyncAction UpdateFilePropertiesAsync(
winrt::Windows::Storage::StorageFile storageFile,
winrt::Microsoft::ReactNative::JSValueObject const &options);
void StartBarcodeScanner();
void StopBarcodeScanner();
winrt::Windows::Foundation::IAsyncAction ScanForBarcodeAsync();
void OnOrientationChanged(const bool updatePreview);
void OnApplicationSuspending();
void OnApplicationResuming();
winrt::Windows::Foundation::IAsyncAction OnUnloaded();
winrt::Microsoft::ReactNative::JSValueObject GetExifObject(
winrt::Windows::Graphics::Imaging::BitmapPropertySet const &properties) noexcept;
bool TryGetValueAsInt(
winrt::Microsoft::ReactNative::JSValueObject const &options,
const std::string key,
int &value,
const int defaultValue) noexcept;
bool TryGetValueAsBool(
winrt::Microsoft::ReactNative::JSValueObject const &options,
const std::string key,
bool &value,
const bool defaultValue) noexcept;
bool TryGetValueAsFloat(
winrt::Microsoft::ReactNative::JSValueObject const &options,
const std::string key,
float &value,
const float defaultValue) noexcept;
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::Windows::System::Threading::ThreadPoolTimer m_recordTimer{nullptr};
winrt::Windows::System::Threading::ThreadPoolTimer m_barcodeScanTimer{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};
bool m_isRecording{false};
int m_flashMode{ReactCameraConstants::CameraFlashModeOff};
int m_whiteBalance{ReactCameraConstants::CameraWhiteBalanceAuto};
int m_focusMode{ReactCameraConstants::CameraAutoFocusOn};
bool m_isPreview{false};
bool m_mirrorVideo{false};
bool m_barcodeScannerEnabled{false};
int m_barcodeReadIntervalMS{ReactCameraConstants::BarcodeReadIntervalMS};
std::string m_cameraId;
winrt::Windows::Devices::Enumeration::Panel m_panelType{winrt::Windows::Devices::Enumeration::Panel::Unknown};
winrt::Windows::Foundation::Collections::IVectorView<winrt::Windows::Media::MediaProperties::IMediaEncodingProperties>
m_availableVideoEncodingProperties;
std::vector<winrt::ZXing::BarcodeType> m_barcodeTypes;
int m_defaultVideoQuality{ReactCameraConstants::CameraVideoQualityAuto};
};
} // namespace winrt::ReactNativeCameraCPP