diff --git a/react/features/base/flags/constants.js b/react/features/base/flags/constants.js index de330fb3f..3523cec87 100644 --- a/react/features/base/flags/constants.js +++ b/react/features/base/flags/constants.js @@ -56,6 +56,12 @@ export const CHAT_ENABLED = 'chat.enabled'; */ export const FILMSTRIP_ENABLED = 'filmstrip.enabled'; +/** + * Flag indicating if fullscreen (immersive) mode should be enabled. + * Default: enabled (true). + */ +export const FULLSCREEN_ENABLED = 'fullscreen.enabled'; + /** * Flag indicating if the Help button should be enabled. * Default: enabled (true). diff --git a/react/features/conference/components/native/Conference.js b/react/features/conference/components/native/Conference.js index c97143833..f4463be87 100644 --- a/react/features/conference/components/native/Conference.js +++ b/react/features/conference/components/native/Conference.js @@ -5,7 +5,7 @@ import { NativeModules, SafeAreaView, StatusBar } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import { appNavigate } from '../../../app/actions'; -import { PIP_ENABLED, getFeatureFlag } from '../../../base/flags'; +import { PIP_ENABLED, FULLSCREEN_ENABLED, getFeatureFlag } from '../../../base/flags'; import { Container, LoadingIndicator, TintedView } from '../../../base/react'; import { connect } from '../../../base/redux'; import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui/constants'; @@ -68,6 +68,11 @@ type Props = AbstractProps & { */ _filmstripVisible: boolean, + /** + * The indicator which determines whether fullscreen (immersive) mode is enabled. + */ + _fullscreenEnabled: boolean, + /** * The ID of the participant currently on stage (if any) */ @@ -145,12 +150,14 @@ class Conference extends AbstractConference { * @returns {ReactElement} */ render() { + const { _fullscreenEnabled } = this.props; + return ( ); @@ -443,6 +450,7 @@ function _mapStateToProps(state) { _calendarEnabled: isCalendarEnabled(state), _connecting: Boolean(connecting_), _filmstripVisible: isFilmstripVisible(state), + _fullscreenEnabled: getFeatureFlag(state, FULLSCREEN_ENABLED, true), _largeVideoParticipantId: state['features/large-video'].participantId, _pictureInPictureEnabled: getFeatureFlag(state, PIP_ENABLED), _reducedUI: reducedUI, diff --git a/react/features/mobile/full-screen/middleware.js b/react/features/mobile/full-screen/middleware.js index 93a5a0fa4..990d06fa9 100644 --- a/react/features/mobile/full-screen/middleware.js +++ b/react/features/mobile/full-screen/middleware.js @@ -5,6 +5,7 @@ import { Immersive } from 'react-native-immersive'; import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../../base/app'; import { getCurrentConference } from '../../base/conference'; import { isAnyDialogOpen } from '../../base/dialog/functions'; +import { FULLSCREEN_ENABLED, getFeatureFlag } from '../../base/flags'; import { Platform } from '../../base/react'; import { MiddlewareRegistry, StateListenerRegistry } from '../../base/redux'; @@ -50,8 +51,9 @@ StateListenerRegistry.register( const { enabled: audioOnly } = state['features/base/audio-only']; const conference = getCurrentConference(state); const dialogOpen = isAnyDialogOpen(state); + const fullscreenEnabled = getFeatureFlag(state, FULLSCREEN_ENABLED, true); - return conference ? !audioOnly && !dialogOpen : false; + return conference ? !audioOnly && !dialogOpen && fullscreenEnabled : false; }, /* listener */ fullScreen => _setFullScreen(fullScreen) );