fcr-ui-scene 3.6.2 → 3.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/creator.d.ts +1 -0
- package/lib/creator.js +38 -26
- package/lib/electron/app.js +5 -4
- package/lib/electron/bootstrap-dev.js +3 -0
- package/lib/electron/injections.d.ts +3 -2
- package/lib/electron/injections.js +5 -6
- package/lib/electron/main.js +15 -11
- package/lib/electron/window.js +0 -3
- package/lib/fragments/annotation/index.d.ts +1 -0
- package/lib/fragments/annotation/index.js +55 -40
- package/lib/fragments/annotation/store.d.ts +7 -2
- package/lib/fragments/annotation/store.js +170 -90
- package/lib/fragments/annotation/view.d.ts +1 -0
- package/lib/fragments/annotation/view.js +10 -2
- package/lib/modules/action-bar/index.css +4 -0
- package/lib/modules/action-bar/store.d.ts +1 -7
- package/lib/modules/action-bar/store.js +35 -82
- package/lib/modules/annotation/board-cursor.css +76 -0
- package/lib/modules/annotation/components/control-bar/index.js +42 -2
- package/lib/modules/annotation/components/toolbar/components/graphic-tool/graphic-panel/index.js +3 -1
- package/lib/modules/annotation/components/toolbar/components/graphic-tool/graphic-panel/libs.d.ts +1 -0
- package/lib/modules/annotation/components/toolbar/components/graphic-tool/graphic-panel/libs.js +11 -5
- package/lib/modules/annotation/components/toolbar/components/item/item.d.ts +1 -0
- package/lib/modules/annotation/components/toolbar/components/item/item.js +3 -2
- package/lib/modules/annotation/index.d.ts +2 -0
- package/lib/modules/annotation/index.js +2 -1
- package/lib/modules/annotation/store.d.ts +11 -3
- package/lib/modules/annotation/store.js +209 -184
- package/lib/modules/annotation/style.css +3 -3
- package/lib/modules/annotation/view.d.ts +1 -0
- package/lib/modules/annotation/view.js +26 -9
- package/lib/modules/components/member-window/components/member-actions/components/audio-control.d.ts +0 -1
- package/lib/modules/components/member-window/components/member-actions/components/audio-control.js +10 -4
- package/lib/modules/components/member-window/components/member-actions/components/icon-buttons/index.d.ts +2 -2
- package/lib/modules/components/member-window/components/member-actions/components/icon-buttons/index.js +4 -4
- package/lib/modules/components/member-window/components/member-actions/components/icon-status.d.ts +0 -2
- package/lib/modules/components/member-window/components/member-actions/components/icon-status.js +3 -4
- package/lib/modules/components/member-window/components/member-actions/components/more-actions.d.ts +0 -3
- package/lib/modules/components/member-window/components/member-actions/components/more-actions.js +6 -32
- package/lib/modules/components/member-window/components/member-actions/components/share-status.js +11 -3
- package/lib/modules/components/member-window/components/member-actions/components/user-info.d.ts +0 -1
- package/lib/modules/components/member-window/components/member-actions/components/user-info.js +7 -10
- package/lib/modules/components/member-window/components/member-actions/components/user-tag.d.ts +0 -1
- package/lib/modules/components/member-window/components/member-actions/components/user-tag.js +0 -2
- package/lib/modules/components/member-window/components/member-actions/index.js +1 -32
- package/lib/modules/components/member-window/components/member-actions/store.d.ts +38 -1
- package/lib/modules/components/member-window/components/member-actions/store.js +130 -23
- package/lib/modules/components/member-window/index.css +37 -0
- package/lib/modules/control-bar/index.d.ts +0 -4
- package/lib/modules/control-bar/index.js +0 -32
- package/lib/modules/control-bar/store.d.ts +4 -6
- package/lib/modules/control-bar/store.js +63 -103
- package/lib/modules/control-bar/view.js +45 -3
- package/lib/modules/dialog/components/control-bar/index.d.ts +0 -2
- package/lib/modules/dialog/components/control-bar/index.js +1 -3
- package/lib/modules/dialog/hooks/useElectron.js +3 -2
- package/lib/modules/dialog/index.d.ts +0 -3
- package/lib/modules/dialog/index.js +1 -25
- package/lib/modules/dialog/store.d.ts +6 -8
- package/lib/modules/dialog/store.js +21 -55
- package/lib/modules/layout/components/CommonVideoRenderer.js +5 -2
- package/lib/modules/layout/type.d.ts +7 -0
- package/lib/modules/participant/store.js +59 -28
- package/lib/modules/setting/index.d.ts +2 -0
- package/lib/modules/setting/index.js +3 -3
- package/lib/modules/setting/store.d.ts +8 -10
- package/lib/modules/setting/store.js +22 -20
- package/lib/modules/share-screen/store.d.ts +3 -0
- package/lib/modules/share-screen/store.js +63 -54
- package/lib/modules/state-bar/index.css +8 -6
- package/lib/modules/state-bar/index.d.ts +2 -0
- package/lib/modules/state-bar/index.js +2 -1
- package/lib/modules/state-bar/layout-config.d.ts +1 -0
- package/lib/modules/state-bar/layout-config.js +15 -5
- package/lib/modules/state-bar/store.d.ts +5 -1
- package/lib/modules/state-bar/store.js +8 -1
- package/lib/modules/state-bar/view.js +9 -5
- package/lib/modules/whiteboard/components/control-bar/store.js +2 -0
- package/lib/modules/whiteboard/components/toolbar/store.d.ts +7 -3
- package/lib/modules/whiteboard/components/toolbar/store.js +61 -35
- package/lib/modules/whiteboard/index.js +3 -2
- package/lib/modules/whiteboard/style.css +0 -4
- package/lib/modules/whiteboard/view.js +8 -2
- package/lib/providers/annotation-provider.d.ts +63 -12
- package/lib/providers/annotation-provider.js +51 -41
- package/lib/providers/device-provider.d.ts +3 -3
- package/lib/providers/device-provider.js +8 -6
- package/lib/providers/event-provider.d.ts +3 -3
- package/lib/providers/screen-share-provider.js +53 -60
- package/lib/providers/sharing-provider.d.ts +5 -1
- package/lib/providers/sharing-provider.js +16 -1
- package/lib/providers/user-setting-storage-provider.d.ts +20 -0
- package/lib/providers/user-setting-storage-provider.js +74 -0
- package/lib/scenes/main-scene.js +2 -3
- package/lib/scenes/waiting-scene.js +1 -1
- package/lib/shared-data-source/config.d.ts +1 -5
- package/lib/shared-data-source/config.js +11 -81
- package/lib/shared-data-source/screen-share-data.d.ts +4 -0
- package/lib/shared-data-source/screen-share-data.js +1 -0
- package/lib/shared-data-source/setting.d.ts +13 -13
- package/lib/shared-data-source/setting.js +10 -6
- package/lib/shared-data-source/video-window.d.ts +2 -1
- package/lib/shared-data-source/video-window.js +56 -36
- package/lib/translations/enUS.d.ts +8 -0
- package/lib/translations/enUS.js +9 -1
- package/lib/translations/zhCN.d.ts +8 -0
- package/lib/translations/zhCN.js +11 -3
- package/lib/type.d.ts +2 -1
- package/lib/ui-scene.js +11 -6
- package/lib/utilities/constant.d.ts +2 -1
- package/lib/utilities/constant.js +1 -0
- package/lib/utilities/setting-config-storage.d.ts +5 -6
- package/lib/utilities/setting-config-storage.js +33 -39
- package/lib/utilities/tools.d.ts +1 -0
- package/lib/utilities/tools.js +3 -2
- package/package.json +8 -6
- package/dist/132.js +0 -2
- package/dist/132.js.LICENSE.txt +0 -311
- package/dist/317.js +0 -2
- package/dist/317.js.LICENSE.txt +0 -20
- package/dist/651.js +0 -2
- package/dist/651.js.LICENSE.txt +0 -1
- package/dist/689343b64b60bfb7ffff.png +0 -0
- package/dist/73.js +0 -1
- package/dist/885f9369ea05a8ac0e56.png +0 -0
- package/dist/90f383876a6e93e7c7ca.png +0 -0
- package/dist/9b37584780995fc5df8c.gif +0 -0
- package/dist/annotation.e5cbd3a70b6d42361872.css +0 -1274
- package/dist/annotation.html +0 -1
- package/dist/annotation.js +0 -2
- package/dist/annotation.js.LICENSE.txt +0 -252
- package/dist/assets/browser/images/default1.jpg +0 -0
- package/dist/assets/browser/images/default2.jpg +0 -0
- package/dist/assets/browser/images/default3.jpg +0 -0
- package/dist/assets/browser/images/default4.jpg +0 -0
- package/dist/assets/browser/images/default5.jpg +0 -0
- package/dist/assets/browser/images/default6.jpg +0 -0
- package/dist/assets/browser/images/default7.jpg +0 -0
- package/dist/assets/browser/sound_effects/pretest.mp3 +0 -0
- package/dist/assets/browser/sound_effects/recording_started.mp3 +0 -0
- package/dist/assets/browser/sound_effects/remote_user_joined.mp3 +0 -0
- package/dist/assets/browser/sound_effects/speaker_test.mp3 +0 -0
- package/dist/assets/browser/videos/default8.mp4 +0 -0
- package/dist/assets/browser/videos/default9.mp4 +0 -0
- package/dist/assets/cursors/fcr_whiteboard_input.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_pen.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_shape_-straightline.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_shape_arrow.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_shape_circle.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_shape_rectangle.ico +0 -0
- package/dist/assets/cursors/fcr_whiteboard_shape_triangle.ico +0 -0
- package/dist/assets/electron/images/default1.jpg +0 -0
- package/dist/assets/electron/images/default2.jpg +0 -0
- package/dist/assets/electron/sound_effects/pretest.mp3 +0 -0
- package/dist/assets/electron/videos/default8.mp4 +0 -0
- package/dist/assets/fcr_chat_reddot.svg +0 -5
- package/dist/assets/fcr_defaultpage.png +0 -0
- package/dist/assets/fcr_grid_big.svg +0 -3
- package/dist/assets/fcr_leave2.svg +0 -58
- package/dist/assets/fcr_listontop_big.svg +0 -3
- package/dist/assets/full-screen-error-boundary-img.png +0 -0
- package/dist/assets/leave-meeting.png +0 -0
- package/dist/assets/loading.gif +0 -0
- package/dist/assets/login_confirm.png +0 -0
- package/dist/assets/pretest.mp3 +0 -0
- package/dist/assets/state-bar-logo.png +0 -0
- package/dist/assets/step-gradient.svg +0 -10
- package/dist/b74b002687a3a3346bec.png +0 -0
- package/dist/b94869094481702f949b.png +0 -0
- package/dist/ebeace75fd46b90d890e.png +0 -0
- package/dist/electron/app.js +0 -194
- package/dist/electron/bootstrap-dev.js +0 -46
- package/dist/electron/bootstrap-sdk.js +0 -211
- package/dist/electron/default-options.js +0 -25
- package/dist/electron/env.js +0 -13
- package/dist/electron/index.js +0 -20
- package/dist/electron/injections.js +0 -903
- package/dist/electron/ipc/ipc.js +0 -141
- package/dist/electron/ipc/type.js +0 -19
- package/dist/electron/logger.js +0 -65
- package/dist/electron/main.js +0 -94
- package/dist/electron/plugins/devtool-shortcut.js +0 -33
- package/dist/electron/plugins/meeting-state.js +0 -39
- package/dist/electron/plugins/screenshot.js +0 -54
- package/dist/electron/preload.js +0 -108
- package/dist/electron/tools.js +0 -66
- package/dist/electron/window.js +0 -123
- package/dist/extensions/agora-extension-virtual-background/agora-wasm.wasm +0 -0
- package/dist/extensions/ai-denoiser/denoiser-wasm-simd.wasm +0 -0
- package/dist/extensions/ai-denoiser/denoiser-wasm.js +0 -1
- package/dist/extensions/ai-denoiser/denoiser-wasm.wasm +0 -0
- package/dist/fad688b9135b15d6c405.png +0 -0
- package/dist/index.html +0 -224
- package/dist/main.393a2a91ab7fc05ffce6.css +0 -15403
- package/dist/main.js +0 -2
- package/dist/main.js.LICENSE.txt +0 -272
- package/dist/worker-entry.worker.js.LICENSE.txt +0 -13
|
@@ -117,7 +117,6 @@ var _mobx = require("mobx");
|
|
|
117
117
|
var _virtualBackdoundResources = require("../modules/device-pretest/assets/virtual-backdound-resources");
|
|
118
118
|
var _type2 = require("../type");
|
|
119
119
|
var _tools = require("../utilities/tools");
|
|
120
|
-
var _store = require("../modules/setting/store");
|
|
121
120
|
var _logger = require("../utilities/logger");
|
|
122
121
|
var _FcrUIDeviceProviderImpl;
|
|
123
122
|
var _initProto, _init__microphoneDeviceId, _init__speakerDeviceId, _init_currentIsMirror, _init_showForceOpenEffectDialog, _init_cameraId, _init_microphoneId, _init_speakerId, _init_cameraEnabled, _init_showCameraPreview, _init_microphoneEnabled, _init_cameraList, _init_microphoneList, _init_microphoneVolumeLevel, _init_speakerList, _init_isLocalMirrorEnabled, _init_isLocalEditBeautyOptions, _init_speakerVolumeLevel, _init_speakerVolume, _init_microphoneVolume, _init_virtualBackgroundName, _init_enableBeauty, _init_beautyKey, _init_beautyOptions, _init_virtualBackgroundList, _init_soundEffectList, _init_microphoneDetecting, _init_speakerDetecting, _init_connectType, _init_isMainRoomAudioOff, _startPlayLocalVideoDecs, _stopPlayLocalVideoDecs, _startSpeakerTestDecs, _stopSpeakerTestDecs, _setCurrentIsMirrorDecs, _toggleLocalMirrorPreviewDecs, _setBeautyOptionsDecs, _handleCancelForceOpenVideoEffectDecs, _handleForceOpenVideoEffectDecs, _setCameraEnabledDecs, _setMicrophoneEnabledDecs, _toggleLocalMirrorDecs, _resetMirrorDecs, _startMicrophoneTestDecs, _stopMicrophoneTestDecs, _enableVirtualBackgroundDecs, _setEditBeautyKeyDecs, _enableBeautyEffectDecs, _setCameraIdDecs, _setSpeakerIdDecs, _setMicrophoneIdDecs, _setSpeakerVolumeDecs, _setMicrophoneVolumeDecs, _loadUiResourcesDecs, _setConnectTypeDecs, _updateVirtualBackgroundListDecs, _handleSpeakerTestVolumeIndicationUpdatedDecs, _handleSpeakerVolumeUpdatedDecs, _handleMicrophoneVolumeIndicationUpdatedDecs, _handleSpeakerAddedDecs, _handleSpeakerRemovedDecs, _handleSpeakerListUpdatedDecs, _setMainRoomAudioOffDecs, _ref;
|
|
@@ -164,7 +163,7 @@ var _b = /*#__PURE__*/new WeakMap();
|
|
|
164
163
|
var _c = /*#__PURE__*/new WeakMap();
|
|
165
164
|
_ref = (_startPlayLocalVideoDecs = [_mobx.action, _mobx.action.bound], _stopPlayLocalVideoDecs = [_mobx.action, _mobx.action.bound], _startSpeakerTestDecs = [_mobx.action, _mobx.action.bound], _stopSpeakerTestDecs = [_mobx.action, _mobx.action.bound], _setCurrentIsMirrorDecs = [_mobx.action, _mobx.action.bound], _toggleLocalMirrorPreviewDecs = [_mobx.action, _mobx.action.bound], _setBeautyOptionsDecs = [_mobx.action, _mobx.action.bound], _handleCancelForceOpenVideoEffectDecs = [_mobx.action, _mobx.action.bound], _handleForceOpenVideoEffectDecs = [_mobx.action, _mobx.action.bound], _setCameraEnabledDecs = [_mobx.action, _mobx.action.bound], _setMicrophoneEnabledDecs = [_mobx.action, _mobx.action.bound], _toggleLocalMirrorDecs = [_mobx.action, _mobx.action.bound], _resetMirrorDecs = [_mobx.action, _mobx.action.bound], _startMicrophoneTestDecs = [_mobx.action, _mobx.action.bound], _stopMicrophoneTestDecs = [_mobx.action, _mobx.action.bound], _enableVirtualBackgroundDecs = [_mobx.action, _mobx.action.bound], _setEditBeautyKeyDecs = [_mobx.action, _mobx.action.bound], _enableBeautyEffectDecs = [_mobx.action, _mobx.action.bound], _setCameraIdDecs = [_mobx.action, _mobx.action.bound], _setSpeakerIdDecs = [_mobx.action, _mobx.action.bound], _setMicrophoneIdDecs = [_mobx.action, _mobx.action.bound], _setSpeakerVolumeDecs = [_mobx.action, _mobx.action.bound], _setMicrophoneVolumeDecs = [_mobx.action, _mobx.action.bound], _loadUiResourcesDecs = [_mobx.action, _mobx.action.bound], _setConnectTypeDecs = [_mobx.action, _mobx.action.bound], _updateVirtualBackgroundListDecs = [_mobx.action, _mobx.action.bound], _handleSpeakerTestVolumeIndicationUpdatedDecs = [_mobx.action, _mobx.action.bound], _handleSpeakerVolumeUpdatedDecs = [_mobx.action, _mobx.action.bound], _handleMicrophoneVolumeIndicationUpdatedDecs = [_mobx.action, _mobx.action.bound], _handleSpeakerAddedDecs = [_mobx.action, _mobx.action.bound], _handleSpeakerRemovedDecs = [_mobx.action, _mobx.action.bound], _handleSpeakerListUpdatedDecs = [_mobx.action, _mobx.action.bound], _setMainRoomAudioOffDecs = [_mobx.action, _mobx.action.bound], "logger");
|
|
166
165
|
var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/function () {
|
|
167
|
-
function FcrUIDeviceProviderImpl(_eventProvider, _mediaControl, _mediaConfig,
|
|
166
|
+
function FcrUIDeviceProviderImpl(_eventProvider, _mediaControl, _mediaConfig, _userSettingStorageProvider) {
|
|
168
167
|
var _this = this;
|
|
169
168
|
(0, _classCallCheck2["default"])(this, FcrUIDeviceProviderImpl);
|
|
170
169
|
(0, _defineProperty2["default"])(this, _ref, (_initProto(this), (0, _logger.createLogger)({
|
|
@@ -234,7 +233,7 @@ var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/fun
|
|
|
234
233
|
this._eventProvider = _eventProvider;
|
|
235
234
|
this._mediaControl = _mediaControl;
|
|
236
235
|
this._mediaConfig = _mediaConfig;
|
|
237
|
-
this.
|
|
236
|
+
this._userSettingStorageProvider = _userSettingStorageProvider;
|
|
238
237
|
this._listeners.push((0, _mobx.reaction)(function () {
|
|
239
238
|
return _this.cameraId;
|
|
240
239
|
}, this._handleCameraChanged));
|
|
@@ -681,7 +680,8 @@ var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/fun
|
|
|
681
680
|
}, {
|
|
682
681
|
key: "_initLocalSetting",
|
|
683
682
|
value: function _initLocalSetting() {
|
|
684
|
-
var
|
|
683
|
+
var _this$_userSettingSto;
|
|
684
|
+
var value = (_this$_userSettingSto = this._userSettingStorageProvider.read()) === null || _this$_userSettingSto === void 0 ? void 0 : _this$_userSettingSto.setting;
|
|
685
685
|
if (value) {
|
|
686
686
|
var _value$microphoneVolu, _value$isLocalMirrorE, _value$editBeautyKey;
|
|
687
687
|
var _microphoneVolume = (_value$microphoneVolu = value.microphoneVolume) !== null && _value$microphoneVolu !== void 0 ? _value$microphoneVolu : this.microphoneVolume;
|
|
@@ -707,6 +707,7 @@ var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/fun
|
|
|
707
707
|
_this2.logger.info('[FcrDeviceStore] init camera list:', list);
|
|
708
708
|
_this2.cameraList = list;
|
|
709
709
|
if (_this2.cameraList.length > 0) {
|
|
710
|
+
var _this2$_userSettingSt;
|
|
710
711
|
var _cameraId = _this2.cameraList[0].deviceId;
|
|
711
712
|
var defaultCameraDeviceId = _this2._getDefaultDeviceId({
|
|
712
713
|
initValue: _cameraId,
|
|
@@ -715,7 +716,7 @@ var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/fun
|
|
|
715
716
|
});
|
|
716
717
|
_this2.logger.info('[FcrDeviceStore] select default camera id:', defaultCameraDeviceId);
|
|
717
718
|
_this2.setCameraId(defaultCameraDeviceId);
|
|
718
|
-
var localSetting = _this2.
|
|
719
|
+
var localSetting = (_this2$_userSettingSt = _this2._userSettingStorageProvider.read()) === null || _this2$_userSettingSt === void 0 ? void 0 : _this2$_userSettingSt.setting;
|
|
719
720
|
if (localSetting) {
|
|
720
721
|
var _localSetting$enableB, _localSetting$beautyO;
|
|
721
722
|
if (localSetting.enable) {
|
|
@@ -1892,10 +1893,11 @@ var FcrUIDeviceProviderImpl = exports.FcrUIDeviceProviderImpl = /*#__PURE__*/fun
|
|
|
1892
1893
|
}, {
|
|
1893
1894
|
key: "_getDefaultDeviceId",
|
|
1894
1895
|
value: function _getDefaultDeviceId(_ref6) {
|
|
1896
|
+
var _this$_userSettingSto2;
|
|
1895
1897
|
var initValue = _ref6.initValue,
|
|
1896
1898
|
localKey = _ref6.localKey,
|
|
1897
1899
|
list = _ref6.list;
|
|
1898
|
-
var localSetting = this.
|
|
1900
|
+
var localSetting = (_this$_userSettingSto2 = this._userSettingStorageProvider.read()) === null || _this$_userSettingSto2 === void 0 ? void 0 : _this$_userSettingSto2.setting;
|
|
1899
1901
|
var defaultValue = initValue;
|
|
1900
1902
|
if (localSetting && localSetting[localKey]) {
|
|
1901
1903
|
var _list$find$deviceId, _list$find;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FcrUIDialogKey, FcrUIAction } from '../utilities/constant';
|
|
2
2
|
import { FcrUserInfo } from 'fcr-core/lib/type';
|
|
3
|
-
import { DeviceSettingDialogConfig,
|
|
3
|
+
import { DeviceSettingDialogConfig, FcrUICustomSetting } from '../modules/setting/store';
|
|
4
4
|
import { FcrUINewChatMessagesParams, FcrUINotificationContentType, FcrUINotificationParams, FcrUISetMainSpeakerParams, FcrUIToastParams } from '../type';
|
|
5
5
|
import { ConfirmContentProps } from 'agora-ui-foundation/lib/components/confirm-content';
|
|
6
6
|
import { FcrRoomType } from 'fcr-core/lib/room-control/type';
|
|
@@ -39,7 +39,7 @@ export interface FcrUIEventProvider {
|
|
|
39
39
|
closeInviteDialog(): void;
|
|
40
40
|
closeWaitingRoomDialog(): void;
|
|
41
41
|
closeRemoveAdmitWaitingRoomDialog(dialogKey: FcrUIDialogKey): void;
|
|
42
|
-
notifyCustomSettingsChanged(settings:
|
|
42
|
+
notifyCustomSettingsChanged(settings: FcrUICustomSetting): void;
|
|
43
43
|
notifyChatUpdateTarget(user: FcrUserInfo, roomType: FcrRoomType): void;
|
|
44
44
|
notifyChatResetTarget(): void;
|
|
45
45
|
addObserver(observer: FcrUIEventObserver): void;
|
|
@@ -79,7 +79,7 @@ export declare class FcrUIEventProviderImpl implements FcrUIEventProvider {
|
|
|
79
79
|
closeInviteDialog(): void;
|
|
80
80
|
closeWaitingRoomDialog(): void;
|
|
81
81
|
closeRemoveAdmitWaitingRoomDialog(dialogKey: FcrUIDialogKey): void;
|
|
82
|
-
notifyCustomSettingsChanged(settings:
|
|
82
|
+
notifyCustomSettingsChanged(settings: FcrUICustomSetting): void;
|
|
83
83
|
addObserver(observer: FcrUIEventObserver): void;
|
|
84
84
|
removeObserver(observer: FcrUIEventObserver): void;
|
|
85
85
|
notifyChatUpdateTarget(user: FcrUserInfo, roomType: FcrRoomType): void;
|
|
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
40
40
|
});
|
|
41
41
|
exports.FcrUIScreenShareProviderImpl = void 0;
|
|
42
42
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
43
|
+
require("core-js/modules/es.array.concat.js");
|
|
43
44
|
require("core-js/modules/es.array.find.js");
|
|
44
45
|
require("core-js/modules/es.array.includes.js");
|
|
45
46
|
require("core-js/modules/es.array.push.js");
|
|
@@ -48,7 +49,6 @@ require("core-js/modules/es.date.to-json.js");
|
|
|
48
49
|
require("core-js/modules/es.json.stringify.js");
|
|
49
50
|
require("core-js/modules/es.object.to-string.js");
|
|
50
51
|
require("core-js/modules/es.promise.js");
|
|
51
|
-
require("core-js/modules/es.promise.finally.js");
|
|
52
52
|
require("core-js/modules/es.string.includes.js");
|
|
53
53
|
require("core-js/modules/esnext.async-iterator.find.js");
|
|
54
54
|
require("core-js/modules/esnext.async-iterator.some.js");
|
|
@@ -76,13 +76,13 @@ var _i18n = require("agora-ui-foundation/lib/i18n");
|
|
|
76
76
|
var _constant = require("../utilities/constant");
|
|
77
77
|
var _lodash = require("lodash");
|
|
78
78
|
var _FcrUIScreenShareProviderImpl;
|
|
79
|
-
var _initProto, _handleScreenCaptureStateUpdatedDecs, _handleShareStopWithAudioDecs, _handleStreamUpdateDecs, _handleStreamPublicDecs, _releaseDecs, _startShareScreenDecs, _handleShareStartWithAudioDecs, _ref;
|
|
79
|
+
var _initProto, _handleScreenCaptureStateUpdatedDecs, _handleShareStopWithAudioDecs, _replaceScreenShareDecs, _handleStreamUpdateDecs, _handleStreamPublicDecs, _releaseDecs, _startShareScreenDecs, _handleShareStartWithAudioDecs, _ref;
|
|
80
80
|
function _applyDecs(e, t, r, n, o, a) { function i(e, t, r) { return function (n, o) { return r && r(n), e[t].call(n, o); }; } function c(e, t) { for (var r = 0; r < e.length; r++) e[r].call(t); return t; } function s(e, t, r, n) { if ("function" != typeof e && (n || void 0 !== e)) throw new TypeError(t + " must " + (r || "be") + " a function" + (n ? "" : " or undefined")); return e; } function applyDec(e, t, r, n, o, a, c, u, l, f, p, d, h) { function m(e) { if (!h(e)) throw new TypeError("Attempted to access private element on non-instance"); } var y, v = t[0], g = t[3], b = !u; if (!b) { r || Array.isArray(v) || (v = [v]); var w = {}, S = [], A = 3 === o ? "get" : 4 === o || d ? "set" : "value"; f ? (p || d ? w = { get: _setFunctionName(function () { return g(this); }, n, "get"), set: function set(e) { t[4](this, e); } } : w[A] = g, p || _setFunctionName(w[A], n, 2 === o ? "" : A)) : p || (w = Object.getOwnPropertyDescriptor(e, n)); } for (var P = e, j = v.length - 1; j >= 0; j -= r ? 2 : 1) { var D = v[j], E = r ? v[j - 1] : void 0, I = {}, O = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: n, metadata: a, addInitializer: function (e, t) { if (e.v) throw Error("attempted to call addInitializer after decoration was finished"); s(t, "An initializer", "be", !0), c.push(t); }.bind(null, I) }; try { if (b) (y = s(D.call(E, P, O), "class decorators", "return")) && (P = y);else { var k, F; O["static"] = l, O["private"] = f, f ? 2 === o ? k = function k(e) { return m(e), w.value; } : (o < 4 && (k = i(w, "get", m)), 3 !== o && (F = i(w, "set", m))) : (k = function k(e) { return e[n]; }, (o < 2 || 4 === o) && (F = function F(e, t) { e[n] = t; })); var N = O.access = { has: f ? h.bind() : function (e) { return n in e; } }; if (k && (N.get = k), F && (N.set = F), P = D.call(E, d ? { get: w.get, set: w.set } : w[A], O), d) { if ("object" == _typeof(P) && P) (y = s(P.get, "accessor.get")) && (w.get = y), (y = s(P.set, "accessor.set")) && (w.set = y), (y = s(P.init, "accessor.init")) && S.push(y);else if (void 0 !== P) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0"); } else s(P, (p ? "field" : "method") + " decorators", "return") && (p ? S.push(P) : w[A] = P); } } finally { I.v = !0; } } return (p || d) && u.push(function (e, t) { for (var r = S.length - 1; r >= 0; r--) t = S[r].call(e, t); return t; }), p || b || (f ? d ? u.push(i(w, "get"), i(w, "set")) : u.push(2 === o ? w[A] : i.call.bind(w[A])) : Object.defineProperty(e, n, w)), P; } function u(e, t) { return Object.defineProperty(e, Symbol.metadata || Symbol["for"]("Symbol.metadata"), { configurable: !0, enumerable: !0, value: t }); } if (arguments.length >= 6) var l = a[Symbol.metadata || Symbol["for"]("Symbol.metadata")]; var f = Object.create(null == l ? null : l), p = function (e, t, r, n) { var o, a, i = [], s = function s(t) { return _checkInRHS(t) === e; }, u = new Map(); function l(e) { e && i.push(c.bind(null, e)); } for (var f = 0; f < t.length; f++) { var p = t[f]; if (Array.isArray(p)) { var d = p[1], h = p[2], m = p.length > 3, y = 16 & d, v = !!(8 & d), g = 0 == (d &= 7), b = h + "/" + v; if (!g && !m) { var w = u.get(b); if (!0 === w || 3 === w && 4 !== d || 4 === w && 3 !== d) throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + h); u.set(b, !(d > 2) || d); } applyDec(v ? e : e.prototype, p, y, m ? "#" + h : _toPropertyKey(h), d, n, v ? a = a || [] : o = o || [], i, v, m, g, 1 === d, v && m ? s : r); } } return l(o), l(a), i; }(e, t, o, f); return r.length || u(e, f), { e: p, get c() { var t = []; return r.length && [u(applyDec(e, [r], n, e.name, 5, f, t), f), c.bind(null, t, e)]; } }; }
|
|
81
81
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
82
82
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
83
83
|
function _setFunctionName(e, t, n) { "symbol" == _typeof(t) && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
|
|
84
84
|
function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? _typeof(e) : "null")); return e; }
|
|
85
|
-
_ref = (_handleScreenCaptureStateUpdatedDecs = [_mobx.action, _mobx.action.bound], _handleShareStopWithAudioDecs = [_mobx.action, _mobx.action.bound], _handleStreamUpdateDecs = [_mobx.action, _mobx.action.bound], _handleStreamPublicDecs = [_mobx.action, _mobx.action.bound], _releaseDecs = [_mobx.action, _mobx.action.bound], _startShareScreenDecs = [_mobx.action, _mobx.action.bound], _handleShareStartWithAudioDecs = [_mobx.action, _mobx.action.bound], "logger");
|
|
85
|
+
_ref = (_handleScreenCaptureStateUpdatedDecs = [_mobx.action, _mobx.action.bound], _handleShareStopWithAudioDecs = [_mobx.action, _mobx.action.bound], _replaceScreenShareDecs = [_mobx.action, _mobx.action.bound], _handleStreamUpdateDecs = [_mobx.action, _mobx.action.bound], _handleStreamPublicDecs = [_mobx.action, _mobx.action.bound], _releaseDecs = [_mobx.action, _mobx.action.bound], _startShareScreenDecs = [_mobx.action, _mobx.action.bound], _handleShareStartWithAudioDecs = [_mobx.action, _mobx.action.bound], "logger");
|
|
86
86
|
var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__PURE__*/function () {
|
|
87
87
|
function FcrUIScreenShareProviderImpl(_deviceProvider, _eventProvider, _roomProvider, _sharingProvider, _sharedScreenShareSharedDataSource, _sharedMemberDataSource) {
|
|
88
88
|
var _this = this,
|
|
@@ -182,6 +182,7 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
182
182
|
this.setShareLock(false);
|
|
183
183
|
(_this$screenTrack = this.screenTrack) === null || _this$screenTrack === void 0 || _this$screenTrack.removeObserver(this._screenCaptureObserver);
|
|
184
184
|
this.isReplaceScreen ? this._screenTrackStop() : this.stop();
|
|
185
|
+
this.logger.info("[Annotation][web]: _handleScreenCaptureStateUpdated: CLOSE, set replaceScreen to: ".concat(this.isReplaceScreen));
|
|
185
186
|
}
|
|
186
187
|
if (state === _fcrCore.FcrMediaSourceState.ERROR) {
|
|
187
188
|
this.setShareLock(false);
|
|
@@ -201,13 +202,14 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
201
202
|
}, {
|
|
202
203
|
key: "_handleScreenCaptureStateUpdated",
|
|
203
204
|
value: function _handleScreenCaptureStateUpdated(sourceId, state) {
|
|
204
|
-
this.logger.info(
|
|
205
|
+
this.logger.info("[handleScreenCaptureStateUpdated]: ".concat(sourceId, " ==== ").concat(state));
|
|
205
206
|
if (state === _fcrCore.FcrMediaSourceState.CLOSE) {
|
|
206
207
|
var _this$screenTrack2;
|
|
207
208
|
this.stopRenderSharePreview(this.screenTrack);
|
|
208
209
|
(_this$screenTrack2 = this.screenTrack) === null || _this$screenTrack2 === void 0 || _this$screenTrack2.removeObserver(this._screenCaptureObserver);
|
|
209
210
|
this.isReplaceScreen ? this._screenTrackStop() : this.stop();
|
|
210
|
-
this._setIsReplaceScreen(false);
|
|
211
|
+
// this._setIsReplaceScreen(false); // 如果是替换的逻辑,暂时不把是否是替换屏幕的值设置为false,改为在结束屏幕共享时重置
|
|
212
|
+
this.logger.info("[Annotation][electron]: _handleScreenCaptureStateUpdated: CLOSE, set replaceScreen to: ".concat(this.isReplaceScreen));
|
|
211
213
|
}
|
|
212
214
|
if (state === _fcrCore.FcrMediaSourceState.ERROR) {
|
|
213
215
|
this.stop();
|
|
@@ -231,6 +233,7 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
231
233
|
key: "replaceScreenShare",
|
|
232
234
|
value: function replaceScreenShare(id, type, withAudio, bounds) {
|
|
233
235
|
var _this2 = this;
|
|
236
|
+
this.logger.info('screen-share-provider: replaceScreenShare start');
|
|
234
237
|
var shareWithAudio = (0, _lodash.isBoolean)(withAudio) ? withAudio : this._sharedScreenShareSharedDataSource.shareWithAudio;
|
|
235
238
|
this.toggleScreenshareWithAudio(shareWithAudio);
|
|
236
239
|
this._sharedScreenShareSharedDataSource.setIsReplaceScreen(true);
|
|
@@ -331,32 +334,28 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
331
334
|
key: "createScreenShareWithSelectionId",
|
|
332
335
|
value: function () {
|
|
333
336
|
var _createScreenShareWithSelectionId = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(videoSourceId, bounds) {
|
|
334
|
-
var _this3 = this;
|
|
335
337
|
var audioSourceId, _this$_sharingControl, streamId;
|
|
336
338
|
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
337
339
|
while (1) switch (_context3.prev = _context3.next) {
|
|
338
340
|
case 0:
|
|
339
341
|
this.logger.info('screen-share-provider: createScreenShareWithSelectionId: ', videoSourceId);
|
|
340
|
-
this.setShareLock(true);
|
|
341
342
|
audioSourceId = this.loopbackAudioSourceId;
|
|
342
343
|
if (!this._sharingControl) {
|
|
343
|
-
_context3.next =
|
|
344
|
+
_context3.next = 9;
|
|
344
345
|
break;
|
|
345
346
|
}
|
|
346
|
-
_context3.next =
|
|
347
|
+
_context3.next = 5;
|
|
347
348
|
return (_this$_sharingControl = this._sharingControl) === null || _this$_sharingControl === void 0 ? void 0 : _this$_sharingControl.startScreenSharing({
|
|
348
349
|
streamType: _imports.AgoraRteMediaStreamType.BOTH,
|
|
349
350
|
videoSourceId: videoSourceId,
|
|
350
351
|
audioSourceId: audioSourceId
|
|
351
|
-
}, bounds)
|
|
352
|
-
|
|
353
|
-
});
|
|
354
|
-
case 6:
|
|
352
|
+
}, bounds);
|
|
353
|
+
case 5:
|
|
355
354
|
streamId = _context3.sent;
|
|
356
355
|
return _context3.abrupt("return", Promise.resolve(streamId));
|
|
357
|
-
case
|
|
356
|
+
case 9:
|
|
358
357
|
return _context3.abrupt("return", Promise.reject());
|
|
359
|
-
case
|
|
358
|
+
case 10:
|
|
360
359
|
case "end":
|
|
361
360
|
return _context3.stop();
|
|
362
361
|
}
|
|
@@ -370,10 +369,10 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
370
369
|
}, {
|
|
371
370
|
key: "_isStoppedFor",
|
|
372
371
|
value: function _isStoppedFor(events, reason) {
|
|
373
|
-
var
|
|
372
|
+
var _this3 = this;
|
|
374
373
|
return events && events.find(function (event) {
|
|
375
374
|
var _event$cause;
|
|
376
|
-
return ((_event$cause = event.cause) === null || _event$cause === void 0 || (_event$cause = _event$cause.data) === null || _event$cause === void 0 ? void 0 : _event$cause.reason) === reason && event.modifiedStream.owner.userId ===
|
|
375
|
+
return ((_event$cause = event.cause) === null || _event$cause === void 0 || (_event$cause = _event$cause.data) === null || _event$cause === void 0 ? void 0 : _event$cause.reason) === reason && event.modifiedStream.owner.userId === _this3.localUserId;
|
|
377
376
|
});
|
|
378
377
|
}
|
|
379
378
|
}, {
|
|
@@ -390,9 +389,9 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
390
389
|
key: "_syncShareStreamState",
|
|
391
390
|
value: function _syncShareStreamState() {
|
|
392
391
|
var _this$_streamControl3,
|
|
393
|
-
|
|
392
|
+
_this4 = this;
|
|
394
393
|
var currentShareStreamId = this.currentShareStreamId || ((_this$_streamControl3 = this._streamControl) === null || _this$_streamControl3 === void 0 || (_this$_streamControl3 = _this$_streamControl3.getStreamList().find(function (stream) {
|
|
395
|
-
return stream.videoSourceType === _type.AgoraRteVideoSourceType.SCREEN && stream.owner.userId ===
|
|
394
|
+
return stream.videoSourceType === _type.AgoraRteVideoSourceType.SCREEN && stream.owner.userId === _this4.localUserId;
|
|
396
395
|
})) === null || _this$_streamControl3 === void 0 ? void 0 : _this$_streamControl3.streamId);
|
|
397
396
|
if (this._sharedScreenShareSharedDataSource.screenSharingState !== _fcrCore.FcrMediaSourceState.OPEN && currentShareStreamId) {
|
|
398
397
|
this.stop();
|
|
@@ -401,7 +400,7 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
401
400
|
}, {
|
|
402
401
|
key: "_handleStreamUpdate",
|
|
403
402
|
value: function _handleStreamUpdate(process, events) {
|
|
404
|
-
var
|
|
403
|
+
var _this5 = this;
|
|
405
404
|
this._handleStreamPublic();
|
|
406
405
|
var isClosedByOther = this._isStoppedFor(events, _types.FcrBoardInactiveReason.CLOSE);
|
|
407
406
|
var isSeizedByOther = this._isStoppedFor(events, _types.FcrBoardInactiveReason.SEIZE);
|
|
@@ -418,11 +417,13 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
418
417
|
});
|
|
419
418
|
switch (process) {
|
|
420
419
|
case 'add':
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
420
|
+
// 抢占流添加时,不设置抢占流状态,因为抢占发生时,会触发 remove 事件,此时判断 reason===seize 的结果设置抢占流状态
|
|
421
|
+
// const newsStreamsHaveScreenShare = events.some(
|
|
422
|
+
// (event) => event.modifiedStream.videoSourceType === AgoraRteVideoSourceType.SCREEN,
|
|
423
|
+
// );
|
|
424
|
+
// const isSeizeStreamAdd =
|
|
425
|
+
// newsStreamsHaveScreenShare && this._sharedScreenShareSharedDataSource.isSharingScreen;
|
|
426
|
+
// this._sharedScreenShareSharedDataSource.setIsSeizeStream(isSeizeStreamAdd);
|
|
426
427
|
break;
|
|
427
428
|
case 'remove':
|
|
428
429
|
var isSeizeStreamRemove = events.some(function (event) {
|
|
@@ -430,14 +431,15 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
430
431
|
return event.modifiedStream.videoSourceType === _type.AgoraRteVideoSourceType.SCREEN && ((_event$cause2 = event.cause) === null || _event$cause2 === void 0 || (_event$cause2 = _event$cause2.data) === null || _event$cause2 === void 0 ? void 0 : _event$cause2.reason) === _types.FcrBoardInactiveReason.SEIZE && ((_event$operatorUser = event.operatorUser) === null || _event$operatorUser === void 0 ? void 0 : _event$operatorUser.userId) !== event.modifiedStream.owner.userId;
|
|
431
432
|
});
|
|
432
433
|
this._sharedScreenShareSharedDataSource.setIsSeizeStream(isSeizeStreamRemove);
|
|
433
|
-
this.logger.info('
|
|
434
|
+
this.logger.info('stream update remove', isSeizeStreamRemove);
|
|
434
435
|
if (events.some(function (event) {
|
|
435
|
-
return event.modifiedStream.videoSourceType === _type.AgoraRteVideoSourceType.SCREEN && event.modifiedStream.owner.userId ===
|
|
436
|
+
return event.modifiedStream.videoSourceType === _type.AgoraRteVideoSourceType.SCREEN && event.modifiedStream.owner.userId === _this5.localUserId;
|
|
436
437
|
})) {
|
|
437
438
|
if (!(0, _env.isElectron)() && this.isReplaceScreen) {
|
|
439
|
+
// web下的替换流不需要停止采集
|
|
438
440
|
this._setIsReplaceScreen(false);
|
|
439
441
|
return;
|
|
440
|
-
}
|
|
442
|
+
}
|
|
441
443
|
this.logger.info('screen-share-provider: current user stream remove');
|
|
442
444
|
this._screenTrackStop();
|
|
443
445
|
}
|
|
@@ -521,20 +523,21 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
521
523
|
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
522
524
|
while (1) switch (_context4.prev = _context4.next) {
|
|
523
525
|
case 0:
|
|
524
|
-
|
|
526
|
+
this.setShareLock(true);
|
|
527
|
+
_context4.prev = 1;
|
|
525
528
|
this.logger.info('screen-share-provider: enter startShareScreen');
|
|
526
529
|
if (!((0, _env.isElectron)() && !isReplace)) {
|
|
527
|
-
_context4.next =
|
|
530
|
+
_context4.next = 8;
|
|
528
531
|
break;
|
|
529
532
|
}
|
|
530
|
-
_context4.next =
|
|
533
|
+
_context4.next = 6;
|
|
531
534
|
return this.createScreenShareWithSelectionId(id, this.currentSelectionBounds);
|
|
532
|
-
case
|
|
535
|
+
case 6:
|
|
533
536
|
streamId = _context4.sent;
|
|
534
537
|
if (streamId) {
|
|
535
538
|
this._sharedScreenShareSharedDataSource.setCurrentShareStreamId(streamId);
|
|
536
539
|
}
|
|
537
|
-
case
|
|
540
|
+
case 8:
|
|
538
541
|
this._sharedScreenShareSharedDataSource.setShareWithAudio(withAudio);
|
|
539
542
|
this.toggleScreenshareWithAudio(withAudio);
|
|
540
543
|
screenTrack = this._deviceProvider.getScreenTrack(id);
|
|
@@ -543,42 +546,42 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
543
546
|
(_this$screenTrack4 = this.screenTrack) === null || _this$screenTrack4 === void 0 || _this$screenTrack4.addObserver(this._screenCaptureObserver);
|
|
544
547
|
_context4.t0 = (_this$screenTrack5 = this.screenTrack) === null || _this$screenTrack5 === void 0;
|
|
545
548
|
if (_context4.t0) {
|
|
546
|
-
_context4.next =
|
|
549
|
+
_context4.next = 29;
|
|
547
550
|
break;
|
|
548
551
|
}
|
|
549
552
|
_context4.t1 = _this$screenTrack5;
|
|
550
553
|
_context4.t2 = type;
|
|
551
554
|
_context4.t3 = withAudio;
|
|
552
555
|
if (!(0, _env.isElectron)()) {
|
|
553
|
-
_context4.next =
|
|
556
|
+
_context4.next = 25;
|
|
554
557
|
break;
|
|
555
558
|
}
|
|
556
|
-
_context4.next =
|
|
559
|
+
_context4.next = 22;
|
|
557
560
|
return this._getExcludeWindows();
|
|
558
|
-
case
|
|
561
|
+
case 22:
|
|
559
562
|
_context4.t4 = _context4.sent;
|
|
560
|
-
_context4.next =
|
|
563
|
+
_context4.next = 26;
|
|
561
564
|
break;
|
|
562
|
-
case 24:
|
|
563
|
-
_context4.t4 = undefined;
|
|
564
565
|
case 25:
|
|
566
|
+
_context4.t4 = undefined;
|
|
567
|
+
case 26:
|
|
565
568
|
_context4.t5 = _context4.t4;
|
|
566
569
|
_context4.t6 = {
|
|
567
570
|
withAudio: _context4.t3,
|
|
568
571
|
excludeWindows: _context4.t5
|
|
569
572
|
};
|
|
570
573
|
_context4.t1.start.call(_context4.t1, _context4.t2, _context4.t6);
|
|
571
|
-
case
|
|
574
|
+
case 29:
|
|
572
575
|
return _context4.abrupt("return", Promise.resolve(this.screenTrack));
|
|
573
|
-
case
|
|
574
|
-
_context4.prev =
|
|
575
|
-
_context4.t7 = _context4["catch"](
|
|
576
|
+
case 32:
|
|
577
|
+
_context4.prev = 32;
|
|
578
|
+
_context4.t7 = _context4["catch"](1);
|
|
576
579
|
return _context4.abrupt("return", Promise.reject(_context4.t7));
|
|
577
|
-
case
|
|
580
|
+
case 35:
|
|
578
581
|
case "end":
|
|
579
582
|
return _context4.stop();
|
|
580
583
|
}
|
|
581
|
-
}, _callee4, this, [[
|
|
584
|
+
}, _callee4, this, [[1, 32]]);
|
|
582
585
|
}));
|
|
583
586
|
function startShareScreen(_x7, _x8, _x9, _x10) {
|
|
584
587
|
return _startShareScreen.apply(this, arguments);
|
|
@@ -590,16 +593,9 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
590
593
|
value: function stopShareScreen(targetScreenTrack) {
|
|
591
594
|
this.logger.info('screen-share-provider: stopShareScreen');
|
|
592
595
|
var screenTrack = targetScreenTrack !== null && targetScreenTrack !== void 0 ? targetScreenTrack : this.screenTrack;
|
|
593
|
-
this.setShareLock(false);
|
|
594
596
|
this.stopRenderSharePreview(screenTrack);
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
this.removeScreenStream();
|
|
598
|
-
} else {
|
|
599
|
-
this.removeScreenStream();
|
|
600
|
-
this._screenTrackStop();
|
|
601
|
-
}
|
|
602
|
-
this._sharedScreenShareSharedDataSource.setCurrentShareId('');
|
|
597
|
+
this.removeScreenStream();
|
|
598
|
+
this._screenTrackStop();
|
|
603
599
|
}
|
|
604
600
|
}, {
|
|
605
601
|
key: "_handleShareStartWithAudio",
|
|
@@ -685,10 +681,6 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
685
681
|
}, {
|
|
686
682
|
key: "removeScreenStream",
|
|
687
683
|
value: function removeScreenStream() {
|
|
688
|
-
var streamId = this.currentShareStreamId;
|
|
689
|
-
if (!streamId) {
|
|
690
|
-
return false;
|
|
691
|
-
}
|
|
692
684
|
try {
|
|
693
685
|
var _this$_streamControl5;
|
|
694
686
|
this.logger.info('screen-share-provider: remove screen streams');
|
|
@@ -706,10 +698,11 @@ var FcrUIScreenShareProviderImpl = exports.FcrUIScreenShareProviderImpl = /*#__P
|
|
|
706
698
|
var _this$screenTrack6;
|
|
707
699
|
this.logger.info('screen-share-provider: current screen track stop');
|
|
708
700
|
(_this$screenTrack6 = this.screenTrack) === null || _this$screenTrack6 === void 0 || _this$screenTrack6.stop();
|
|
701
|
+
this.setShareLock(false);
|
|
709
702
|
}
|
|
710
703
|
}]);
|
|
711
704
|
}();
|
|
712
705
|
_FcrUIScreenShareProviderImpl = FcrUIScreenShareProviderImpl;
|
|
713
|
-
var _applyDecs$e = (0, _slicedToArray2["default"])(_applyDecs(_FcrUIScreenShareProviderImpl, [[_decorator.bound, 2, "getCurrentScreenSharingOwner"], [_decorator.bound, 2, "stop"], [_decorator.bound, 2, "bootstrap"], [_decorator.bound, 2, "_handleWebScreenCaptureStateUpdated"], [_handleScreenCaptureStateUpdatedDecs, 18, "_handleScreenCaptureStateUpdated"], [_handleShareStopWithAudioDecs, 18, "_handleShareStopWithAudio"], [_decorator.bound, 2, "_syncShareStreamState"], [_handleStreamUpdateDecs, 18, "_handleStreamUpdate"], [_decorator.bound, 2, "startRenderSharePreview"], [_decorator.bound, 2, "stopRenderSharePreview"], [_handleStreamPublicDecs, 18, "_handleStreamPublic"], [_releaseDecs, 18, "release"], [_startShareScreenDecs, 18, "startShareScreen"], [_handleShareStartWithAudioDecs, 18, "_handleShareStartWithAudio"], [_decorator.bound, 2, "_getExcludeWindows"], [_decorator.bound, 2, "_screenTrackStop"]], []).e, 1);
|
|
706
|
+
var _applyDecs$e = (0, _slicedToArray2["default"])(_applyDecs(_FcrUIScreenShareProviderImpl, [[_decorator.bound, 2, "getCurrentScreenSharingOwner"], [_decorator.bound, 2, "stop"], [_decorator.bound, 2, "bootstrap"], [_decorator.bound, 2, "_handleWebScreenCaptureStateUpdated"], [_handleScreenCaptureStateUpdatedDecs, 18, "_handleScreenCaptureStateUpdated"], [_handleShareStopWithAudioDecs, 18, "_handleShareStopWithAudio"], [_replaceScreenShareDecs, 18, "replaceScreenShare"], [_decorator.bound, 2, "_syncShareStreamState"], [_handleStreamUpdateDecs, 18, "_handleStreamUpdate"], [_decorator.bound, 2, "startRenderSharePreview"], [_decorator.bound, 2, "stopRenderSharePreview"], [_handleStreamPublicDecs, 18, "_handleStreamPublic"], [_releaseDecs, 18, "release"], [_startShareScreenDecs, 18, "startShareScreen"], [_handleShareStartWithAudioDecs, 18, "_handleShareStartWithAudio"], [_decorator.bound, 2, "_getExcludeWindows"], [_decorator.bound, 2, "_screenTrackStop"]], []).e, 1);
|
|
714
707
|
_initProto = _applyDecs$e[0];
|
|
715
708
|
(0, _base.registerDependency)('screenShareProvider');
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FcrScreenSharingState, FcrSharingControl, FcrWhiteboardState } from 'fcr-core/lib/room-control/sharing-control/type';
|
|
2
2
|
import { FcrScreenStreamCreateConfig } from 'fcr-core/lib/room-control/stream-control/type';
|
|
3
|
+
import { FcrUIScreenShareSharedDataSource } from '../shared-data-source/screen-share-data';
|
|
3
4
|
export interface FcrUISharingProvider {
|
|
4
5
|
get screenSharingOwnerId(): string;
|
|
5
6
|
get whiteboardOwnerId(): string;
|
|
@@ -15,13 +16,16 @@ export interface FcrUISharingProvider {
|
|
|
15
16
|
}
|
|
16
17
|
export declare class FcrUISharingProviderImpl implements FcrUISharingProvider {
|
|
17
18
|
private _sharingControl;
|
|
19
|
+
private _sharedScreenShareSharedDataSource;
|
|
18
20
|
protected logger: import("agora-foundation/lib/logger").Logger;
|
|
19
21
|
private _observer;
|
|
20
22
|
accessor screenSharingOwnerId: string;
|
|
21
23
|
accessor whiteboardOwnerId: string;
|
|
22
24
|
accessor screenSharingState: FcrScreenSharingState;
|
|
23
25
|
accessor whiteboardState: FcrWhiteboardState;
|
|
24
|
-
|
|
26
|
+
get isReplaceScreen(): boolean;
|
|
27
|
+
get isSeizeStream(): boolean;
|
|
28
|
+
constructor(_sharingControl: FcrSharingControl, _sharedScreenShareSharedDataSource: FcrUIScreenShareSharedDataSource);
|
|
25
29
|
startScreenSharing(config: FcrScreenStreamCreateConfig): void;
|
|
26
30
|
startWhiteboard(): void;
|
|
27
31
|
updateScreenSharing(enableAnnotation: boolean): void;
|
|
@@ -70,7 +70,7 @@ var _B = /*#__PURE__*/new WeakMap();
|
|
|
70
70
|
var _C = /*#__PURE__*/new WeakMap();
|
|
71
71
|
var _D = /*#__PURE__*/new WeakMap();
|
|
72
72
|
var FcrUISharingProviderImpl = exports.FcrUISharingProviderImpl = /*#__PURE__*/function () {
|
|
73
|
-
function FcrUISharingProviderImpl(_sharingControl) {
|
|
73
|
+
function FcrUISharingProviderImpl(_sharingControl, _sharedScreenShareSharedDataSource) {
|
|
74
74
|
var _this = this;
|
|
75
75
|
(0, _classCallCheck2["default"])(this, FcrUISharingProviderImpl);
|
|
76
76
|
(0, _defineProperty2["default"])(this, "logger", (_initProto(this), (0, _logger.createLogger)({
|
|
@@ -80,6 +80,10 @@ var FcrUISharingProviderImpl = exports.FcrUISharingProviderImpl = /*#__PURE__*/f
|
|
|
80
80
|
onScreenSharingUpdated: function onScreenSharingUpdated(ownerId, state) {
|
|
81
81
|
_this.screenSharingOwnerId = ownerId;
|
|
82
82
|
_this.screenSharingState = state;
|
|
83
|
+
if (state === _type.FcrScreenSharingState.END) {
|
|
84
|
+
_this.isReplaceScreen && _this._sharedScreenShareSharedDataSource.setIsReplaceScreen(false);
|
|
85
|
+
_this.isSeizeStream && _this._sharedScreenShareSharedDataSource.setIsSeizeStream(false);
|
|
86
|
+
}
|
|
83
87
|
},
|
|
84
88
|
onWhiteboardStarted: function onWhiteboardStarted(ownerId, operatorUser) {
|
|
85
89
|
_this.whiteboardOwnerId = ownerId;
|
|
@@ -94,6 +98,7 @@ var FcrUISharingProviderImpl = exports.FcrUISharingProviderImpl = /*#__PURE__*/f
|
|
|
94
98
|
_classPrivateFieldInitSpec(this, _C, _init_screenSharingState(this, _type.FcrScreenSharingState.END));
|
|
95
99
|
_classPrivateFieldInitSpec(this, _D, _init_whiteboardState(this, _type.FcrWhiteboardState.END));
|
|
96
100
|
this._sharingControl = _sharingControl;
|
|
101
|
+
this._sharedScreenShareSharedDataSource = _sharedScreenShareSharedDataSource;
|
|
97
102
|
// @ts-ignore
|
|
98
103
|
// this._sharingControl.getToken();
|
|
99
104
|
this._sharingControl.addObserver(this._observer);
|
|
@@ -130,6 +135,16 @@ var FcrUISharingProviderImpl = exports.FcrUISharingProviderImpl = /*#__PURE__*/f
|
|
|
130
135
|
set: function set(v) {
|
|
131
136
|
_classPrivateFieldSet(_D, this, v);
|
|
132
137
|
}
|
|
138
|
+
}, {
|
|
139
|
+
key: "isReplaceScreen",
|
|
140
|
+
get: function get() {
|
|
141
|
+
return this._sharedScreenShareSharedDataSource.isReplaceScreen;
|
|
142
|
+
}
|
|
143
|
+
}, {
|
|
144
|
+
key: "isSeizeStream",
|
|
145
|
+
get: function get() {
|
|
146
|
+
return this._sharedScreenShareSharedDataSource.isSeizeStream;
|
|
147
|
+
}
|
|
133
148
|
}, {
|
|
134
149
|
key: "startScreenSharing",
|
|
135
150
|
value: function startScreenSharing(config) {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FcrUISettingConfig } from '../type';
|
|
2
|
+
export interface FcrUIUserSettingStorageProvider {
|
|
3
|
+
/**
|
|
4
|
+
* 写入本地存储
|
|
5
|
+
* @param key
|
|
6
|
+
* @param value
|
|
7
|
+
*/
|
|
8
|
+
write(value: Partial<FcrUISettingConfig>): number;
|
|
9
|
+
/**
|
|
10
|
+
* 从本地存储读取
|
|
11
|
+
* @param key
|
|
12
|
+
*/
|
|
13
|
+
read(): FcrUISettingConfig | null;
|
|
14
|
+
}
|
|
15
|
+
export declare class FcrUIUserSettingStorageProviderImpl implements FcrUIUserSettingStorageProvider {
|
|
16
|
+
private _isElectron;
|
|
17
|
+
constructor();
|
|
18
|
+
write(value: Partial<FcrUISettingConfig>): number;
|
|
19
|
+
read(): any;
|
|
20
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.symbol.js");
|
|
4
|
+
require("core-js/modules/es.array.filter.js");
|
|
5
|
+
require("core-js/modules/es.array.for-each.js");
|
|
6
|
+
require("core-js/modules/es.array.push.js");
|
|
7
|
+
require("core-js/modules/es.object.define-properties.js");
|
|
8
|
+
require("core-js/modules/es.object.define-property.js");
|
|
9
|
+
require("core-js/modules/es.object.get-own-property-descriptor.js");
|
|
10
|
+
require("core-js/modules/es.object.get-own-property-descriptors.js");
|
|
11
|
+
require("core-js/modules/es.object.to-string.js");
|
|
12
|
+
require("core-js/modules/esnext.async-iterator.filter.js");
|
|
13
|
+
require("core-js/modules/esnext.async-iterator.for-each.js");
|
|
14
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
15
|
+
require("core-js/modules/esnext.iterator.filter.js");
|
|
16
|
+
require("core-js/modules/esnext.iterator.for-each.js");
|
|
17
|
+
require("core-js/modules/web.dom-collections.for-each.js");
|
|
18
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
19
|
+
Object.defineProperty(exports, "__esModule", {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
exports.FcrUIUserSettingStorageProviderImpl = void 0;
|
|
23
|
+
require("core-js/modules/es.date.to-json.js");
|
|
24
|
+
require("core-js/modules/es.json.stringify.js");
|
|
25
|
+
require("core-js/modules/es.object.keys.js");
|
|
26
|
+
require("core-js/modules/esnext.json.parse.js");
|
|
27
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
28
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
29
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
30
|
+
var _base = require("../base");
|
|
31
|
+
var _env = require("agora-foundation/lib/utilities/env");
|
|
32
|
+
var _settingConfigStorage = require("../utilities/setting-config-storage");
|
|
33
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
34
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
35
|
+
var FcrUIUserSettingStorageProviderImpl = exports.FcrUIUserSettingStorageProviderImpl = /*#__PURE__*/function () {
|
|
36
|
+
function FcrUIUserSettingStorageProviderImpl() {
|
|
37
|
+
(0, _classCallCheck2["default"])(this, FcrUIUserSettingStorageProviderImpl);
|
|
38
|
+
(0, _defineProperty2["default"])(this, "_isElectron", false);
|
|
39
|
+
this._isElectron = (0, _env.isElectron)();
|
|
40
|
+
}
|
|
41
|
+
return (0, _createClass2["default"])(FcrUIUserSettingStorageProviderImpl, [{
|
|
42
|
+
key: "write",
|
|
43
|
+
value: function write(value) {
|
|
44
|
+
var userSetting = this.read();
|
|
45
|
+
if (userSetting) {
|
|
46
|
+
value = _objectSpread(_objectSpread({}, userSetting), value);
|
|
47
|
+
}
|
|
48
|
+
if (this._isElectron) {
|
|
49
|
+
window.runtime.setUserSettingData(value);
|
|
50
|
+
} else {
|
|
51
|
+
localStorage.setItem(_settingConfigStorage.settingConfigStorageKey, JSON.stringify(value));
|
|
52
|
+
}
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
}, {
|
|
56
|
+
key: "read",
|
|
57
|
+
value: function read() {
|
|
58
|
+
if (this._isElectron) {
|
|
59
|
+
return window.runtime.getUserSettingData();
|
|
60
|
+
} else {
|
|
61
|
+
var getItem = localStorage.getItem(_settingConfigStorage.settingConfigStorageKey);
|
|
62
|
+
return getItem ? JSON.parse(getItem) : null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// remove(key: string) {
|
|
67
|
+
// localStorage.removeItem(key);
|
|
68
|
+
// }
|
|
69
|
+
}]);
|
|
70
|
+
}(); // export enum FcrLocalStorageSettingKey {
|
|
71
|
+
// SpotlightEnabled = 'spotlightEnabled',
|
|
72
|
+
// ShouldHideNonVideoParticipants = 'shouldHideNonVideoParticipants',
|
|
73
|
+
// }
|
|
74
|
+
(0, _base.registerDependency)('userSettingStorageProvider');
|
package/lib/scenes/main-scene.js
CHANGED
|
@@ -196,7 +196,7 @@ var FcrMainUIScene = exports.FcrMainUIScene = /*#__PURE__*/function (_FcrBaseUIS
|
|
|
196
196
|
var waitingRoomControlProvider = new _roomProvider.FcrUIWaitingRoomControlProviderImpl(roomProvider, eventProvider);
|
|
197
197
|
var monitorProvider = new _monitorProvider.FcrUIMonitorProviderImpl(engine.getMonitorControl());
|
|
198
198
|
var chatProvider = new _chatProvider.FcrUIChatProviderImpl(currentRoomControlProvider.currentRoomControl, roomProvider);
|
|
199
|
-
var sharingProvider = new _sharingProvider.FcrUISharingProviderImpl(sharingControl);
|
|
199
|
+
var sharingProvider = new _sharingProvider.FcrUISharingProviderImpl(sharingControl, sharedScreenShareSharedDataSource);
|
|
200
200
|
var sharedWaitingRoomDataSource = new _waitingRoom.FcrUISharedWaitingRoomDataSourceImpl(roomProvider, eventProvider);
|
|
201
201
|
var phoneAudioConnectorProvider = new _phoneAudioProvider.FcrUIPhoneAudioConnectorProviderImpl({
|
|
202
202
|
roomControl: mainRoomControl,
|
|
@@ -461,8 +461,7 @@ var FcrMainUIScene = exports.FcrMainUIScene = /*#__PURE__*/function (_FcrBaseUIS
|
|
|
461
461
|
key: _constant.FcrUIDialogKey.CONTROL_BAR,
|
|
462
462
|
component: function component(props) {
|
|
463
463
|
return (0, _env.isElectron)() ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_controlBar2.ControlBarDialog, {
|
|
464
|
-
module: controlbarUIModule
|
|
465
|
-
params: props.params
|
|
464
|
+
module: controlbarUIModule
|
|
466
465
|
}, "ControlBar") : shareScreenModule.getComponent();
|
|
467
466
|
}
|
|
468
467
|
}, {
|
|
@@ -92,7 +92,7 @@ var FcrWaitingUIScene = exports.FcrWaitingUIScene = /*#__PURE__*/function (_FcrB
|
|
|
92
92
|
var deviceStreamProvider = new _deviceStreamProvider.FcrUIDeviceStreamProviderImpl(waitingRoomControl, deviceProvider, messageProvider, dialogProvider, devicePrivilegeProvider, sharedDevicePrivilegeDataSource);
|
|
93
93
|
var sharedChatDataSource = new _chatData.FcrUISharedChatDataSourceImpl(chatProvider);
|
|
94
94
|
var sharingControl = waitingRoomControl.getSharingControl();
|
|
95
|
-
var sharingProvider = new _sharingProvider.FcrUISharingProviderImpl(sharingControl);
|
|
95
|
+
var sharingProvider = new _sharingProvider.FcrUISharingProviderImpl(sharingControl, sharedScreenShareSharedDataSource);
|
|
96
96
|
var sharedInterpreterDataSource = new _interpreter.FcrUISharedInterpreterDataSourceImpl();
|
|
97
97
|
var sharedMemberDataSource = new _memberData.FcrUIMemberSharedDataSourceImpl(userControl, streamControl, sharedScreenShareSharedDataSource);
|
|
98
98
|
var screenShareProvider = new _screenShareProvider.FcrUIScreenShareProviderImpl(deviceProvider, eventProvider, roomProvider, sharingProvider, sharedScreenShareSharedDataSource, sharedMemberDataSource);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { FcrUILocalStorageProvider } from '../providers/local-storage-provider';
|
|
2
1
|
import { FcrUISceneConfig, FcrUISceneCreatorConfig, FcrUISettingConfig } from '../type';
|
|
3
2
|
export interface FcrUISharedConfigDataSource {
|
|
4
3
|
get settingConfig(): FcrUISettingConfig;
|
|
@@ -6,15 +5,12 @@ export interface FcrUISharedConfigDataSource {
|
|
|
6
5
|
get sceneConfig(): FcrUISceneConfig;
|
|
7
6
|
}
|
|
8
7
|
export declare class FcrUISharedConfigDataSourceImpl implements FcrUISharedConfigDataSource {
|
|
9
|
-
private _localStorageProvider;
|
|
10
8
|
settingConfig: FcrUISettingConfig;
|
|
11
9
|
creatorConfig: FcrUISceneCreatorConfig;
|
|
12
10
|
sceneConfig: FcrUISceneConfig;
|
|
13
|
-
constructor({ settingConfig, creatorConfig, sceneConfig,
|
|
11
|
+
constructor({ settingConfig, creatorConfig, sceneConfig, }: {
|
|
14
12
|
settingConfig: FcrUISettingConfig;
|
|
15
13
|
creatorConfig: FcrUISceneCreatorConfig;
|
|
16
14
|
sceneConfig?: FcrUISceneConfig;
|
|
17
|
-
localStorageProvider: FcrUILocalStorageProvider;
|
|
18
15
|
});
|
|
19
|
-
private _initConfig;
|
|
20
16
|
}
|