Source: zoom_setting_video.js

const { ZoomSDKError } = require('./settings.js');
const messages = require('./electron_sdk_pb.js');

/**
*@module
*/
var ZoomVideoSetting = (function () {
  let instance;
   /**
   * mode: Zoom SDK VideoSettings Service Init
   * @param {Object} addon zoom sdk module
   * @return {ZoomVideoSetting}
   */
  function init(opts) {
 
    let clientOpts = opts || {};

    // Private methods and variables
    let _addon = clientOpts.addon.GetSettingVideoCtrl() || null;
    let _onComputerCamDeviceChanged = clientOpts.onComputerCamDeviceChanged || null;
    let _onDefaultCamDeviceChanged = clientOpts.onDefaultCamDeviceChanged || null;
    
    let deviceItem = {};
    function ParseDeviceList(str) {
      str.forEach(function (item, index) {
        deviceItem.deviceName = item.deviceName
        deviceItem.deviceId = item.deviceId
        deviceItem.isSelected = item.isSelected
      });
      return deviceItem;
    }
    
    function onComputerCamDeviceChanged(newCameraList) {
      if (_onComputerCamDeviceChanged) {
        _onComputerCamDeviceChanged(newCameraList)
      }
    }
    
    function onDefaultCamDeviceChanged(deviceId, deviceName) {
      if (_onDefaultCamDeviceChanged) {
        _onDefaultCamDeviceChanged(deviceId, deviceName)
      }
    }
    
    if (_addon) {
      _addon.SetComputerCamDeviceChangedCB(onComputerCamDeviceChanged);
      _addon.SetDefaultCamDeviceChangedCB(onDefaultCamDeviceChanged);
    }

    return {
      /**
      * mode: Set Computer Cam Device Changed CB
      * @param {Function} onComputerCamDeviceChanged
      * @return {Boolean}
      */
      Setting_SetComputerCamDeviceChangedCB: function (onComputerCamDeviceChanged) {
        if (_addon && onComputerCamDeviceChanged && onComputerCamDeviceChanged instanceof Function) {
          _onComputerCamDeviceChanged = onComputerCamDeviceChanged;
          return true;
        }
        return false;
      },
      /**
      * mode: Set Default Cam Device Changed CB
      * @param {Function} onDefaultCamDeviceChanged
      * @return {Boolean}
      */
      Setting_SetDefaultCamDeviceChangedCB: function (onDefaultCamDeviceChanged) {
        if (_addon && onDefaultCamDeviceChanged && onDefaultCamDeviceChanged instanceof Function) {
          _onDefaultCamDeviceChanged = onDefaultCamDeviceChanged;
          return true;
        }
        return false;
      },
      /** mode: Select Camera
      * @param {String} zn_deviceId Device id of camera
      * @return {ZoomSDKError}
      */
      Setting_SelectVideoCamera: function(opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let zn_deviceId = clientOpts.zn_deviceId || deviceItem.deviceId;
          try {
            let SelectVideoCameraParams = new messages.SelectVideoCameraParams();
            SelectVideoCameraParams.setDeviceid(zn_deviceId);
            let bytes = SelectVideoCameraParams.serializeBinary();
            return _addon.SelectVideoCamera(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Get Camera List
      * @return {ZoomSDKError}
      */
      Setting_GetCameraList: function () {
        if (_addon) {
          let devicelist_str = _addon.GetCameraList();
          return ParseDeviceList(devicelist_str);
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Setting Enable Video Mirror Effect
      * @param {Boolean} zn_bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableVideoMirrorEffect: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let zn_bEnable = clientOpts.zn_bEnable;
          try {
            let EnableVideoMirrorEffectParams = new messages.EnableVideoMirrorEffectParams();
            EnableVideoMirrorEffectParams.setBenable(zn_bEnable);
            let bytes = EnableVideoMirrorEffectParams.serializeBinary();
            return _addon.EnableVideoMirrorEffect(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE
      },
      /** mode: Setting Enable Face Beauty Effect
      * @param {Boolean} zn_bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableFaceBeautyEffect: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let zn_bEnable = clientOpts.zn_bEnable;
          try {
            let EnableFaceBeautyEffectParams = new messages.EnableFaceBeautyEffectParams();
            EnableFaceBeautyEffectParams.setBenable(zn_bEnable);
            let bytes = EnableFaceBeautyEffectParams.serializeBinary();
            return _addon.EnableFaceBeautyEffect(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Check if Video Mirror Effect Enabled.
      * @return {ZoomSDKError}
      */
      Checking_IsMirrorEffectEnabled: function () {
        if (_addon) {
          return _addon.IsMirrorEffectEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE
      },
      /** mode: Check if Face Beauty Effect Enabled.
      * @return {ZoomSDKError}
      */
      Checking_IsFaceBeautyEffectEnabled: function (opts) {
        if (_addon) {
          return _addon.IsFaceBeautyEffectEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE
      },
      /** mode: Enable HD Video
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableHDVideo: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableHDVideoParams = new messages.EnableHDVideoParams();
            EnableHDVideoParams.setBenable(bEnable);
            let bytes = EnableHDVideoParams.serializeBinary();
            return _addon.EnableHDVideo(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is HD Video Enabled
      * @return {ZoomSDKError}
      */
      Setting_IsHDVideoEnabled: function () {
        if (_addon) {
          return _addon.IsHDVideoEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Always Show Name On Video
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableAlwaysShowNameOnVideo: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableAlwaysShowNameOnVideoParams = new messages.EnableAlwaysShowNameOnVideoParams();
            EnableAlwaysShowNameOnVideoParams.setBenable(bEnable);
            let bytes = EnableAlwaysShowNameOnVideoParams.serializeBinary();
            return _addon.EnableAlwaysShowNameOnVideo(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Always Show Name On Video Enabled
      * @return {ZoomSDKError}
      */
      Setting_IsAlwaysShowNameOnVideoEnabled: function () {
        if (_addon) {
          return _addon.IsAlwaysShowNameOnVideoEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Auto Turn Off Video When Join Meeting
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableAutoTurnOffVideoWhenJoinMeeting: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableAutoTurnOffVideoWhenJoinMeetingParams = new messages.EnableAutoTurnOffVideoWhenJoinMeetingParams();
            EnableAutoTurnOffVideoWhenJoinMeetingParams.setBenable(bEnable);
            let bytes = EnableAutoTurnOffVideoWhenJoinMeetingParams.serializeBinary();
            return _addon.EnableAutoTurnOffVideoWhenJoinMeeting(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Auto Turn Off Video When Join Meeting Enabled
      * @return {ZoomSDKError}
      */
      Setting_IsAutoTurnOffVideoWhenJoinMeetingEnabled: function () {
        if (_addon) {
          return _addon.IsAutoTurnOffVideoWhenJoinMeetingEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Always Use 16v9
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableAlwaysUse16v9: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableAlwaysUse16v9Params = new messages.EnableAlwaysUse16v9Params();
            EnableAlwaysUse16v9Params.setBenable(bEnable);
            let bytes = EnableAlwaysUse16v9Params.serializeBinary();
            return _addon.EnableAlwaysUse16v9(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Always Use 16v9
      * @return {ZoomSDKError}
      */
      Setting_IsAlwaysUse16v9: function (ops) {
        if (_addon) {
          return _addon.IsAlwaysUse16v9();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Spot light Self
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableSpotlightSelf: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableSpotlightSelfParams = new messages.EnableSpotlightSelfParams();
            EnableSpotlightSelfParams.setBenable(bEnable);
            let bytes = EnableSpotlightSelfParams.serializeBinary();
            return _addon.EnableSpotlightSelf(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Spot light Self Enabled
      * @return {ZoomSDKError}
      */
      Setting_IsSpotlightSelfEnabled: function () {
        if (_addon) {
          return _addon.IsSpotlightSelfEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Hardware Encode
      * @param {Boolean} bEnable Enable or not
      * @param {Number} encodeType see ZoomSDKVideoHardwareEncodeType in setting.js
      * @return {ZoomSDKError}
      */
      Setting_EnableHardwareEncode: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          let encodeType = clientOpts.encodeType;
          try {
            let EnableHardwareEncodeParams = new messages.EnableHardwareEncodeParams();
            EnableHardwareEncodeParams.setBenable(bEnable);
            EnableHardwareEncodeParams.setEncodetype(encodeType);
            let bytes = EnableHardwareEncodeParams.serializeBinary();
            return _addon.EnableHardwareEncode(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Hardware Encode Enabled
      * @param {Number} encodeType see ZoomSDKVideoHardwareEncodeType in setting.js
      * @return {ZoomSDKError}
      */
      Setting_IsHardwareEncodeEnabled: function () {
        if (_addon) {
          let clientOpts = opts || {};
          let encodeType = clientOpts.encodeType;
          try {
            let IsHardwareEncodeEnabledParams = new messages.IsHardwareEncodeEnabledParams();
            IsHardwareEncodeEnabledParams.setEncodetype(encodeType);
            let bytes = IsHardwareEncodeEnabledParams.serializeBinary();
            return _addon.IsHardwareEncodeEnabled(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable 49Videoes InGallary View
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_Enable49VideoesInGallaryView: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let Enable49VideoesInGallaryViewParams = new messages.Enable49VideoesInGallaryViewParams();
            Enable49VideoesInGallaryViewParams.setBenable(bEnable);
            let bytes = Enable49VideoesInGallaryViewParams.serializeBinary();
            return _addon.Enable49VideoesInGallaryView(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is b49 Videoes In Gallary View Enabled
      * @return {ZoomSDKError}
      */
      Setting_Is49VideoesInGallaryViewEnabled: function () {
        if (_addon) {
          return _addon.Is49VideoesInGallaryViewEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Hide No Video Users On WallView
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableHideNoVideoUsersOnWallView: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable;
          try {
            let EnableHideNoVideoUsersOnWallViewParams = new messages.EnableHideNoVideoUsersOnWallViewParams();
            EnableHideNoVideoUsersOnWallViewParams.setBenable(bEnable);
            let bytes = EnableHideNoVideoUsersOnWallViewParams.serializeBinary();
            return _addon.EnableHideNoVideoUsersOnWallView(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Hide No Video Users On Wall View Enabled
      * @return {ZoomSDKError}
      */
      Setting_IsHideNoVideoUsersOnWallViewEnabled: function () {
        if (_addon) {
          return _addon.IsHideNoVideoUsersOnWallViewEnabled();
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Enable Video Preview Dialog
      * @param {Boolean} bEnable Enable or not
      * @return {ZoomSDKError}
      */
      Setting_EnableVideoPreviewDialog: function (opts) {
        if (_addon) {
          let clientOpts = opts || {};
          let bEnable = clientOpts.bEnable || true;
          try {
            let EnableVideoPreviewDialogParams = new messages.EnableVideoPreviewDialogParams();
            EnableVideoPreviewDialogParams.setBenable(bEnable);
            let bytes = EnableVideoPreviewDialogParams.serializeBinary();
            return _addon.EnableVideoPreviewDialog(bytes);
          } catch (error) {
            return ZoomSDKError.SDKERR_INVALID_PARAMETER;
          }
        }
        return ZoomSDKError.SDKERR_UNINITIALIZE;
      },
      /** mode: Is Video Preview Dialog Enabled
      * @return {Boolean}
      */
      Setting_IsVideoPreviewDialogEnabled: function () {
        if (_addon) {
          return _addon.IsVideoPreviewDialogEnabled();
        }
        return false;
      }
    };
};
  return {
    /**
     * mode: Get Zoom SDK Video Setting Service Module
     * @return {ZoomVideoSetting}
    */
    getInstance: function (opts) {
      if (!instance) {
        instance = init(opts)
      }
      return instance
    }
  };
})();

module.exports = {
  ZoomVideoSetting: ZoomVideoSetting
}