diff --git a/react/features/base/participants/components/Avatar.native.js b/react/features/base/participants/components/Avatar.native.js
index f34cafbe0..ebc5363e5 100644
--- a/react/features/base/participants/components/Avatar.native.js
+++ b/react/features/base/participants/components/Avatar.native.js
@@ -6,6 +6,8 @@ import { CachedImage, ImageCache } from '../../../mobile/image-cache';
import { Platform } from '../../react';
import { ColorPalette } from '../../styles';
+import styles from './styles';
+
/**
* The default image/source to be used in case none is specified or the
* specified one fails to load.
@@ -32,10 +34,9 @@ export default class Avatar extends Component {
*/
static propTypes = {
/**
- * The optional style to add to the {@link Avatar} in order to customize
- * its base look (and feel).
+ * The size for the {@link Avatar}.
*/
- style: PropTypes.object,
+ size: PropTypes.number,
/**
* The URI of the {@link Avatar}.
@@ -216,7 +217,7 @@ export default class Avatar extends Component {
/* eslint-enable no-unused-vars */
- style,
+ size,
...props
} = this.props;
const {
@@ -224,6 +225,19 @@ export default class Avatar extends Component {
source
} = this.state;
+ // Compute the base style
+ const style = {
+ ...styles.avatar,
+
+ // XXX Workaround for Android: for radii < 80 the border radius
+ // doesn't work properly, but applying a radius twice as big
+ // seems to do the trick.
+ borderRadius: size / 2 < 80
+ ? Platform.OS === 'android' ? size * 2 : size / 2 : size / 2,
+ height: size,
+ width: size
+ };
+
// If we're rendering the _DEFAULT_SOURCE, then we want to do some
// additional fu like having automagical colors generated per
// participant, transparency to make the intermediate state while
diff --git a/react/features/base/participants/components/ParticipantView.native.js b/react/features/base/participants/components/ParticipantView.native.js
index 300ecf07d..565106b1f 100644
--- a/react/features/base/participants/components/ParticipantView.native.js
+++ b/react/features/base/participants/components/ParticipantView.native.js
@@ -73,9 +73,9 @@ class ParticipantView extends Component {
_videoTrack: PropTypes.object,
/**
- * The style, if any, of the avatar in addition to the default style.
+ * The avatar size.
*/
- avatarStyle: PropTypes.object,
+ avatarSize: PropTypes.number,
/**
* The ID of the participant (to be) depicted by ParticipantView.
@@ -145,7 +145,7 @@ class ParticipantView extends Component {
}
const {
- avatarStyle,
+ avatarSize,
_participantName: displayName,
t
} = this.props;
@@ -154,7 +154,7 @@ class ParticipantView extends Component {
// view and one for the thumbnail. Some of these don't apply to both.
const containerStyle = {
...styles.connectionInfoContainer,
- width: avatarStyle.width * 1.5
+ width: avatarSize * 1.5
};
return (
@@ -230,7 +230,7 @@ class ParticipantView extends Component {
// rendered.
&& _toBoolean(this.props.showAvatar, true)
&& }
{ useTint
diff --git a/react/features/base/participants/components/styles.js b/react/features/base/participants/components/styles.js
index a90731a00..2e27fc2a1 100644
--- a/react/features/base/participants/components/styles.js
+++ b/react/features/base/participants/components/styles.js
@@ -4,6 +4,14 @@ import { BoxModel, ColorPalette, createStyleSheet } from '../../styles';
* The styles of the feature base/participants.
*/
export default createStyleSheet({
+ /**
+ * The style of the avatar of the participant.
+ */
+ avatar: {
+ alignSelf: 'center',
+ flex: 0
+ },
+
/**
* Style for the text rendered when there is a connectivity problem.
*/
diff --git a/react/features/filmstrip/components/Thumbnail.js b/react/features/filmstrip/components/Thumbnail.js
index 8ed2dd1d7..cd4fcb85e 100644
--- a/react/features/filmstrip/components/Thumbnail.js
+++ b/react/features/filmstrip/components/Thumbnail.js
@@ -19,6 +19,8 @@ import {
VideoMutedIndicator
} from './_';
+import { AVATAR_SIZE } from './styles';
+
/**
* React component for video thumbnail.
* @extends Component
@@ -94,7 +96,7 @@ class Thumbnail extends Component {
= { audioTrack.jitsiTrack.getOriginalStream() } /> }
{
- /**
- * LargeVideo component's property types.
- *
- * @static
- */
- static propTypes = {
- /**
- * The ID of the participant (to be) depicted by LargeVideo.
- *
- * @private
- */
- _participantId: PropTypes.string
+class LargeVideo extends Component {
+ state = {
+ ...DEFAULT_STATE
};
+ /** Initializes a new {@code LargeVideo} instance.
+ *
+ * @param {Object} props - The read-only properties with which the new
+ * instance is to be initialized.
+ */
+ constructor(props) {
+ super(props);
+
+ this._onDimensionsChanged = this._onDimensionsChanged.bind(this);
+ }
+
+ _onDimensionsChanged: (width: number, height: number) => void;
+
+ /**
+ * Handle this component's dimension changes. In case we deem it's too
+ * small, the connectivity indicator won't be rendered and the avatar
+ * will occupy the entirety of the available screen state.
+ *
+ * @param {number} width - The component's current width.
+ * @param {number} height - The component's current height.
+ * @private
+ * @returns {void}
+ */
+ _onDimensionsChanged(width: number, height: number) {
+ // Get the size, rounded to the nearest even number.
+ const size = 2 * Math.round(Math.min(height, width) / 2);
+
+ let newState;
+
+ if (size < AVATAR_SIZE * 1.5) {
+ newState = {
+ avatarSize: size - 15, // Leave some margin.
+ useConnectivityInfoLabel: false
+ };
+ } else {
+ newState = DEFAULT_STATE;
+ }
+
+ this.setState(newState);
+ }
+
/**
* Implements React's {@link Component#render()}.
*
@@ -36,13 +97,21 @@ class LargeVideo extends Component<*> {
* @returns {ReactElement}
*/
render() {
+ const {
+ avatarSize,
+ useConnectivityInfoLabel
+ } = this.state;
+
return (
-
+
+
+
);
}
}
diff --git a/react/features/large-video/components/styles.js b/react/features/large-video/components/styles.js
index a3ac55547..a7da3ce92 100644
--- a/react/features/large-video/components/styles.js
+++ b/react/features/large-video/components/styles.js
@@ -1,18 +1,11 @@
import { ColorPalette, createStyleSheet } from '../../base/styles';
-export default createStyleSheet({
- /**
- * The style of the avatar of the participant displayed in largeVideo. It's
- * an addition to the default style of Avatar.
- */
- avatar: {
- alignSelf: 'center',
- borderRadius: 100,
- flex: 0,
- height: 200,
- width: 200
- },
+/**
+ * Size for the Avatar.
+ */
+export const AVATAR_SIZE = 200;
+export default createStyleSheet({
/**
* Large video container style.
*/