Listens for suspend events from jitsi-power-monitor on postis channel. (#4428)
* Listens for suspend events from jitsi-power-monitor on postis channel. * Removes duplicated type and actions. * Moves suspendDetected state from overlay to power-monitor feature.
This commit is contained in:
parent
9bf650c700
commit
9071cd4813
|
@ -114,10 +114,8 @@ import {
|
||||||
maybeOpenFeedbackDialog,
|
maybeOpenFeedbackDialog,
|
||||||
submitFeedback
|
submitFeedback
|
||||||
} from './react/features/feedback';
|
} from './react/features/feedback';
|
||||||
import {
|
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
|
||||||
mediaPermissionPromptVisibilityChanged,
|
import { suspendDetected } from './react/features/power-monitor';
|
||||||
suspendDetected
|
|
||||||
} from './react/features/overlay';
|
|
||||||
import { setSharedVideoStatus } from './react/features/shared-video';
|
import { setSharedVideoStatus } from './react/features/shared-video';
|
||||||
import { isButtonEnabled } from './react/features/toolbox';
|
import { isButtonEnabled } from './react/features/toolbox';
|
||||||
import { endpointMessageReceived } from './react/features/subtitles';
|
import { endpointMessageReceived } from './react/features/subtitles';
|
||||||
|
@ -1932,33 +1930,6 @@ export default {
|
||||||
|
|
||||||
room.on(JitsiConferenceEvents.SUSPEND_DETECTED, () => {
|
room.on(JitsiConferenceEvents.SUSPEND_DETECTED, () => {
|
||||||
APP.store.dispatch(suspendDetected());
|
APP.store.dispatch(suspendDetected());
|
||||||
|
|
||||||
// After wake up, we will be in a state where conference is left
|
|
||||||
// there will be dialog shown to user.
|
|
||||||
// We do not want video/audio as we show an overlay and after it
|
|
||||||
// user need to rejoin or close, while waking up we can detect
|
|
||||||
// camera wakeup as a problem with device.
|
|
||||||
// We also do not care about device change, which happens
|
|
||||||
// on resume after suspending PC.
|
|
||||||
if (this.deviceChangeListener) {
|
|
||||||
JitsiMeetJS.mediaDevices.removeEventListener(
|
|
||||||
JitsiMediaDevicesEvents.DEVICE_LIST_CHANGED,
|
|
||||||
this.deviceChangeListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop local video
|
|
||||||
if (this.localVideo) {
|
|
||||||
this.localVideo.dispose();
|
|
||||||
this.localVideo = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop local audio
|
|
||||||
if (this.localAudio) {
|
|
||||||
this.localAudio.dispose();
|
|
||||||
this.localAudio = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
APP.API.notifySuspendDetected();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
|
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
|
||||||
|
@ -2214,6 +2185,27 @@ export default {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanups local conference on suspend.
|
||||||
|
*/
|
||||||
|
onSuspendDetected() {
|
||||||
|
// After wake up, we will be in a state where conference is left
|
||||||
|
// there will be dialog shown to user.
|
||||||
|
// We do not want video/audio as we show an overlay and after it
|
||||||
|
// user need to rejoin or close, while waking up we can detect
|
||||||
|
// camera wakeup as a problem with device.
|
||||||
|
// We also do not care about device change, which happens
|
||||||
|
// on resume after suspending PC.
|
||||||
|
if (this.deviceChangeListener) {
|
||||||
|
JitsiMeetJS.mediaDevices.removeEventListener(
|
||||||
|
JitsiMediaDevicesEvents.DEVICE_LIST_CHANGED,
|
||||||
|
this.deviceChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.localVideo = null;
|
||||||
|
this.localAudio = null;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback invoked when the conference has been successfully joined.
|
* Callback invoked when the conference has been successfully joined.
|
||||||
* Initializes the UI and various other features.
|
* Initializes the UI and various other features.
|
||||||
|
|
|
@ -8,6 +8,7 @@ import '../../base/user-interaction';
|
||||||
import '../../base/responsive-ui';
|
import '../../base/responsive-ui';
|
||||||
import '../../chat';
|
import '../../chat';
|
||||||
import '../../external-api';
|
import '../../external-api';
|
||||||
|
import '../../power-monitor';
|
||||||
import '../../room-lock';
|
import '../../room-lock';
|
||||||
import '../../video-layout';
|
import '../../video-layout';
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
* Formats the conference pin in readable way for UI to display it.
|
* Formats the conference pin in readable way for UI to display it.
|
||||||
* Formats the pin in 3 groups of digits:
|
* Formats the pin in 3 groups of digits:
|
||||||
* XXXX XXXX XX or XXXXX XXXXX XXX.
|
* XXXX XXXX XX or XXXXX XXXXX XXX.
|
||||||
* The length of first and second group is Math.ceil(pin.length / 3)
|
* The length of first and second group is Math.ceil(pin.length / 3).
|
||||||
*
|
*
|
||||||
* @param {Object} conferenceID - The conference id to format, string or number.
|
* @param {Object} conferenceID - The conference id to format, string or number.
|
||||||
* @returns {string} - The formatted conference pin.
|
* @returns {string} - The formatted conference pin.
|
||||||
|
|
|
@ -25,13 +25,3 @@ export const MEDIA_PERMISSION_PROMPT_VISIBILITY_CHANGED
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
export const SET_FATAL_ERROR = 'SET_FATAL_ERROR';
|
export const SET_FATAL_ERROR = 'SET_FATAL_ERROR';
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of the Redux action which signals that a suspend was detected.
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* type: SUSPEND_DETECTED
|
|
||||||
* }
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export const SUSPEND_DETECTED = 'SUSPEND_DETECTED';
|
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
import {
|
import {
|
||||||
MEDIA_PERMISSION_PROMPT_VISIBILITY_CHANGED,
|
MEDIA_PERMISSION_PROMPT_VISIBILITY_CHANGED,
|
||||||
SET_FATAL_ERROR,
|
SET_FATAL_ERROR
|
||||||
SUSPEND_DETECTED
|
|
||||||
} from './actionTypes';
|
} from './actionTypes';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,20 +26,6 @@ export function mediaPermissionPromptVisibilityChanged(isVisible: boolean, brows
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Signals that suspend was detected.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
* @returns {{
|
|
||||||
* type: SUSPEND_DETECTED
|
|
||||||
* }}
|
|
||||||
*/
|
|
||||||
export function suspendDetected() {
|
|
||||||
return {
|
|
||||||
type: SUSPEND_DETECTED
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The action indicates that an unrecoverable error has occurred and the reload
|
* The action indicates that an unrecoverable error has occurred and the reload
|
||||||
* screen will be displayed or hidden.
|
* screen will be displayed or hidden.
|
||||||
|
|
|
@ -28,6 +28,6 @@ export default class AbstractSuspendedOverlay extends Component<Props> {
|
||||||
* {@code false}, otherwise.
|
* {@code false}, otherwise.
|
||||||
*/
|
*/
|
||||||
static needsRender(state: Object) {
|
static needsRender(state: Object) {
|
||||||
return state['features/overlay'].suspendDetected;
|
return state['features/power-monitor'].suspendDetected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,7 @@ import { assign, ReducerRegistry, set } from '../base/redux';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
MEDIA_PERMISSION_PROMPT_VISIBILITY_CHANGED,
|
MEDIA_PERMISSION_PROMPT_VISIBILITY_CHANGED,
|
||||||
SET_FATAL_ERROR,
|
SET_FATAL_ERROR
|
||||||
SUSPEND_DETECTED
|
|
||||||
} from './actionTypes';
|
} from './actionTypes';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,8 +28,6 @@ ReducerRegistry.register('features/overlay', (state = { }, action) => {
|
||||||
case SET_FATAL_ERROR:
|
case SET_FATAL_ERROR:
|
||||||
return _setFatalError(state, action);
|
return _setFatalError(state, action);
|
||||||
|
|
||||||
case SUSPEND_DETECTED:
|
|
||||||
return _suspendDetected(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
|
@ -80,15 +77,3 @@ function _setShowLoadConfigOverlay(state, show) {
|
||||||
function _setFatalError(state, { fatalError }) {
|
function _setFatalError(state, { fatalError }) {
|
||||||
return set(state, 'fatalError', fatalError);
|
return set(state, 'fatalError', fatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reduces a specific redux action SUSPEND_DETECTED of the feature overlay.
|
|
||||||
*
|
|
||||||
* @param {Object} state - The redux state of the feature overlay.
|
|
||||||
* @private
|
|
||||||
* @returns {Object} The new state of the feature overlay after the reduction of
|
|
||||||
* the specified action.
|
|
||||||
*/
|
|
||||||
function _suspendDetected(state) {
|
|
||||||
return set(state, 'suspendDetected', true);
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of the Redux action which signals that a suspend was detected.
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* type: SUSPEND_DETECTED
|
||||||
|
* }
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
export const SUSPEND_DETECTED = 'SUSPEND_DETECTED';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of the Redux action which signals that a transport needs to be stored.
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* type: SET_TRANSPORT
|
||||||
|
* }
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
export const SET_TRANSPORT = 'SET_TRANSPORT';
|
|
@ -0,0 +1,37 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import {
|
||||||
|
SET_TRANSPORT,
|
||||||
|
SUSPEND_DETECTED
|
||||||
|
} from './actionTypes';
|
||||||
|
import { Transport } from '../../../modules/transport';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals that suspend was detected.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
* @returns {{
|
||||||
|
* type: SUSPEND_DETECTED
|
||||||
|
* }}
|
||||||
|
*/
|
||||||
|
export function suspendDetected() {
|
||||||
|
return {
|
||||||
|
type: SUSPEND_DETECTED
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals setting of a transport.
|
||||||
|
*
|
||||||
|
* @param {Transport} transport - The transport to save in the state.
|
||||||
|
* @returns {{
|
||||||
|
* transport: Transport,
|
||||||
|
* type: string
|
||||||
|
* }}
|
||||||
|
*/
|
||||||
|
export function setTransport(transport: ?Transport) {
|
||||||
|
return {
|
||||||
|
type: SET_TRANSPORT,
|
||||||
|
transport
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
export * from './actions';
|
||||||
|
export * from './actionTypes';
|
||||||
|
|
||||||
|
import './middleware';
|
||||||
|
import './reducer';
|
|
@ -0,0 +1,74 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import {
|
||||||
|
setTransport,
|
||||||
|
suspendDetected
|
||||||
|
} from './actions';
|
||||||
|
import { SUSPEND_DETECTED } from './actionTypes';
|
||||||
|
|
||||||
|
import {
|
||||||
|
CONFERENCE_JOINED,
|
||||||
|
CONFERENCE_LEFT
|
||||||
|
} from '../base/conference';
|
||||||
|
import { MiddlewareRegistry } from '../base/redux';
|
||||||
|
import {
|
||||||
|
PostMessageTransportBackend,
|
||||||
|
Transport
|
||||||
|
} from '../../../modules/transport';
|
||||||
|
import { destroyLocalTracks } from '../base/tracks';
|
||||||
|
|
||||||
|
declare var APP: Object;
|
||||||
|
|
||||||
|
MiddlewareRegistry.register(store => next => action => {
|
||||||
|
const result = next(action);
|
||||||
|
const { dispatch, getState } = store;
|
||||||
|
|
||||||
|
switch (action.type) {
|
||||||
|
case CONFERENCE_JOINED: {
|
||||||
|
|
||||||
|
// listens for messages about suspend from power-monitor
|
||||||
|
const transport = new Transport({
|
||||||
|
backend: new PostMessageTransportBackend({
|
||||||
|
postisOptions: { scope: 'jitsi-power-monitor' }
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
transport.on('event', event => {
|
||||||
|
if (event && event.name === 'power-monitor' && event.event === 'suspend') {
|
||||||
|
|
||||||
|
dispatch(suspendDetected());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
dispatch(setTransport(transport));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case CONFERENCE_LEFT: {
|
||||||
|
const { transport } = getState()['features/power-monitor'];
|
||||||
|
|
||||||
|
if (transport) {
|
||||||
|
transport.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(setTransport());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SUSPEND_DETECTED: {
|
||||||
|
dispatch(destroyLocalTracks());
|
||||||
|
|
||||||
|
// FIXME: when refactoring conference.js
|
||||||
|
APP.conference.onSuspendDetected();
|
||||||
|
|
||||||
|
APP.API.notifySuspendDetected();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
|
@ -0,0 +1,51 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import { ReducerRegistry, set } from '../base/redux';
|
||||||
|
import { Transport } from '../../../modules/transport';
|
||||||
|
|
||||||
|
import {
|
||||||
|
SET_TRANSPORT,
|
||||||
|
SUSPEND_DETECTED
|
||||||
|
} from './actionTypes';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduces the redux actions of the feature power monitor.
|
||||||
|
*/
|
||||||
|
ReducerRegistry.register('features/power-monitor', (state = { }, action) => {
|
||||||
|
switch (action.type) {
|
||||||
|
case SET_TRANSPORT:
|
||||||
|
return _setTransport(state, action.transport);
|
||||||
|
|
||||||
|
case SUSPEND_DETECTED:
|
||||||
|
return _suspendDetected(state);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduces a specific redux action SET_TRANSPORT of the feature power monitor.
|
||||||
|
*
|
||||||
|
* @param {Object} state - The redux state of the feature power monitor.
|
||||||
|
* @param {?Transport} transport - The transport to store in state.
|
||||||
|
* @private
|
||||||
|
* @returns {Object} The new state of the feature power monitor after the reduction of
|
||||||
|
* the specified action.
|
||||||
|
*/
|
||||||
|
function _setTransport(state, transport: ?Transport) {
|
||||||
|
return set(state, 'transport', transport);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduces a specific redux action SUSPEND_DETECTED of the feature overlay.
|
||||||
|
*
|
||||||
|
* @param {Object} state - The redux state of the feature overlay.
|
||||||
|
* @private
|
||||||
|
* @returns {Object} The new state of the feature overlay after the reduction of
|
||||||
|
* the specified action.
|
||||||
|
*/
|
||||||
|
function _suspendDetected(state) {
|
||||||
|
return set(state, 'suspendDetected', true);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue