diff --git a/react/features/base/media/constants.ts b/react/features/base/media/constants.ts index 4d0d38654..3b26f1e42 100644 --- a/react/features/base/media/constants.ts +++ b/react/features/base/media/constants.ts @@ -43,7 +43,8 @@ export const VIDEO_MUTISM_AUTHORITY = { AUDIO_ONLY: 1 << 0, BACKGROUND: 1 << 1, USER: 1 << 2, - CAR_MODE: 1 << 3 + CAR_MODE: 1 << 3, + SCREEN_SHARE: 1 << 4 }; /* eslint-enable no-bitwise */ diff --git a/react/features/base/tracks/actions.native.ts b/react/features/base/tracks/actions.native.ts index 06cdd4e28..ee2628be9 100644 --- a/react/features/base/tracks/actions.native.ts +++ b/react/features/base/tracks/actions.native.ts @@ -4,9 +4,17 @@ import { IReduxState, IStore } from '../../app/types'; import { setPictureInPictureEnabled } from '../../mobile/picture-in-picture/functions'; import { setAudioOnly } from '../audio-only/actions'; import JitsiMeetJS from '../lib-jitsi-meet'; +import { + setScreenshareMuted, + setVideoMuted +} from '../media/actions'; +import { + MEDIA_TYPE, + VIDEO_MUTISM_AUTHORITY +} from '../media/constants'; -import { destroyLocalDesktopTrackIfExists, replaceLocalTrack } from './actions.any'; -import { getLocalVideoTrack, isLocalVideoTrackDesktop } from './functions'; +import { addLocalTrack, replaceLocalTrack } from './actions.any'; +import { getLocalDesktopTrack, getTrackState, isLocalVideoTrackDesktop } from './functions.native'; export * from './actions.any'; @@ -31,7 +39,8 @@ export function toggleScreensharing(enabled: boolean, _ignore1?: boolean, _ignor _startScreenSharing(dispatch, state); } } else { - dispatch(destroyLocalDesktopTrackIfExists()); + dispatch(setScreenshareMuted(true)); + dispatch(setVideoMuted(false, MEDIA_TYPE.VIDEO, VIDEO_MUTISM_AUTHORITY.SCREEN_SHARE)); setPictureInPictureEnabled(true); } }; @@ -47,26 +56,33 @@ export function toggleScreensharing(enabled: boolean, _ignore1?: boolean, _ignor * @param {Object} state - The redux state. * @returns {void} */ -function _startScreenSharing(dispatch: Function, state: IReduxState) { +async function _startScreenSharing(dispatch: Function, state: IReduxState) { setPictureInPictureEnabled(false); - JitsiMeetJS.createLocalTracks({ devices: [ 'desktop' ] }) - .then((tracks: any[]) => { + try { + const tracks: any[] = await JitsiMeetJS.createLocalTracks({ devices: [ 'desktop' ] }); const track = tracks[0]; - const currentLocalTrack = getLocalVideoTrack(state['features/base/tracks']); - const currentJitsiTrack = currentLocalTrack?.jitsiTrack; + const currentLocalDesktopTrack = getLocalDesktopTrack(getTrackState(state)); + const currentJitsiTrack = currentLocalDesktopTrack?.jitsiTrack; - dispatch(replaceLocalTrack(currentJitsiTrack, track)); + // The first time the user shares the screen we add the track and create the transceiver. + // Afterwards, we just replace the old track, so the transceiver will be reused. + if (currentJitsiTrack) { + dispatch(replaceLocalTrack(currentJitsiTrack, track)); + } else { + dispatch(addLocalTrack(track)); + } + + dispatch(setVideoMuted(true, MEDIA_TYPE.VIDEO, VIDEO_MUTISM_AUTHORITY.SCREEN_SHARE)); const { enabled: audioOnly } = state['features/base/audio-only']; if (audioOnly) { dispatch(setAudioOnly(false)); } - }) - .catch((error: any) => { + } catch (error: any) { console.log('ERROR creating ScreeSharing stream ', error); setPictureInPictureEnabled(true); - }); + } } diff --git a/react/features/base/tracks/functions.any.ts b/react/features/base/tracks/functions.any.ts index 0e681da46..32d96fdcf 100644 --- a/react/features/base/tracks/functions.any.ts +++ b/react/features/base/tracks/functions.any.ts @@ -313,9 +313,9 @@ export function isLocalTrackMuted(tracks: ITrack[], mediaType: MediaType) { * @returns {boolean} */ export function isLocalVideoTrackDesktop(state: IReduxState) { - const videoTrack = getLocalVideoTrack(getTrackState(state)); + const desktopTrack = getLocalDesktopTrack(getTrackState(state)); - return videoTrack && videoTrack.videoType === VIDEO_TYPE.DESKTOP; + return desktopTrack !== undefined && !desktopTrack.muted; }