diff --git a/web/plugin.head.html b/web/plugin.head.html index 306c6cd..99db04d 100644 --- a/web/plugin.head.html +++ b/web/plugin.head.html @@ -2047,6 +2047,42 @@ return getPoliticTalkRenderedParticipantTiles(videospace, 44, 44).length; } + function getPoliticTalkRemoteParticipantCount(videospace, tiles, thumbnails) { + var room = getPoliticTalkConferenceRoom(); + + try { + if (room && typeof room.getParticipants === 'function') { + return room.getParticipants().length; + } + } catch (error) { + // Fall back to visible tile state when Jitsi internals are unavailable. + } + + var localEndpointId = getPoliticTalkLocalEndpointId(); + var countedIds = {}; + var candidates = (tiles || []).concat(thumbnails || []); + + if (videospace) { + candidates = candidates.concat(getPoliticTalkRenderedParticipantTiles(videospace, 44, 44)); + } + + candidates.forEach(function(candidate) { + if (!candidate || candidate.id === 'localVideo_container') { + return; + } + + var endpointId = getPoliticTalkTileEndpointId(candidate); + + if (endpointId && localEndpointId && endpointId === localEndpointId) { + return; + } + + countedIds[endpointId || candidate.id || String(Object.keys(countedIds).length)] = true; + }); + + return Object.keys(countedIds).length; + } + function isPoliticTalkAvatarShell(element, tile) { if (!element || element === tile || element.tagName === 'IMG' || element.tagName === 'CANVAS') { return false; @@ -2760,7 +2796,7 @@ }); } - function applyPoliticTalkLargeVideoLayout(videospace, tiles) { + function applyPoliticTalkLargeVideoLayout(videospace, tiles, thumbnails) { if (!videospace) { return; } @@ -2774,8 +2810,9 @@ var candidateTileCount = Array.isArray(tiles) ? tiles.length : 0; var renderedTileCount = getPoliticTalkRenderedParticipantTileCount(videospace); var visibleTileCount = Math.max(candidateTileCount, renderedTileCount); + var remoteParticipantCount = getPoliticTalkRemoteParticipantCount(videospace, tiles, thumbnails); - setPoliticTalkDominantSpeakerLayerVisibility(videospace, visibleTileCount <= 1); + setPoliticTalkDominantSpeakerLayerVisibility(videospace, remoteParticipantCount > 0 && visibleTileCount <= 1); var availableHeight = getPoliticTalkAvailableTileHeight(videospace); @@ -2886,7 +2923,7 @@ ); var dominantMetadata = getPoliticTalkDominantSpeakerRoleMetadata(videospace, tiles, thumbnails); - applyPoliticTalkLargeVideoLayout(videospace, tiles); + applyPoliticTalkLargeVideoLayout(videospace, tiles, thumbnails); applyPoliticTalkTileLayout(videospace, tiles); applyPoliticTalkDominantSpeakerTheme(videospace, tiles, thumbnails, dominantMetadata);