;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Telegram libera chamadas de vídeo em grupo; veja como usar

Getty Images
Imagem: Getty Images

Aurélio Araújo

Colaboração para Tilt

28/06/2021 14h54

Quem curte usar o Telegram agora vai poder fazer chamadas de vídeo em grupo e compartilhar telas com os contatos. A atualização foi divulgada pela empresa na sexta-feira (25).

Segundo o aplicativo de troca de mensagens, a mudança foi feita para facilitar o uso durante as aulas online, encontros de negócios e reuniões familiares.

Como usar

Para ar a nova opção de chamada de vídeo em grupo, você precisa clicar no ícone de câmera localizado na parte inferior da tela durante nos chats de voz.

Chamadas em grupo no Telegram - Reprodução - Reprodução
Chamadas em grupo no Telegram
Imagem: Reprodução

Ao tocar no vídeo de um dos participantes, você faz com que a imagem preencha a tela toda. Há um ícone de alfinete que permite torná-lo fixo. Assim, é possível manter o foco nessa pessoa específica, à medida que mais gente vai entrando na videochamada.

Tela de compartilhamento de vídeo - Reprodução - Reprodução
Tela de compartilhamento de vídeo
Imagem: Reprodução

Embora o número de participantes de um chat de áudio seja ilimitado, apenas as primeiras 30 pessoas que entrarem nesse chat conseguem compartilhar seus vídeos.

A intenção do Telegram, segundo a empresa, é que esse número cresça a partir do momento em que os chats sejam mais usados para streaming (transmissão online) de games e eventos digitais.

Compartilhar tela

A opção de compartilhamento de tela agora está disponível no app, podendo ser ativada a partir do menu disponível no ícone de três pontos.

Entre as opções que aparecem, está "Compartilhar tela". Ao selecionar, uma tela confirmando a ação aparece. Vá no "Começar Agora" (Start now, em inglês) e pronto.

Tela para compartilhar tela em chamadas em grupo - Reprodução - Reprodução
Tela para compartilhar tela em chamadas em grupo
Imagem: Reprodução

Outras novidades

Também nessa última atualização, o Telegram incluiu a possibilidade de supressão de ruído nos chats de áudio — algo que pode ser ligado ou desligado, caso afete alguma função de uso da conversa.

Outra novidade é uma adaptação da versão do aplicativo para tablets e computadores desktop: para utilizar melhor o espaço de tela disponível, o Telegram ou a incluir novas opções no display.

Com elas, é possível escolher a visualização dos vídeos na chamada, bem como ar a lista de pessoas que estão participando dela, tanto na orientação vertical quanto horizontal.

No desktop, as videochamadas am a abrir numa janela à parte, para que você possa digitar e falar sem ter de se preocupar em minimizá-la. Nele, também pode ser feito um compartilhamento de tela seletivo, mostrando apenas uma janela, em vez de toda a tela.

Por fim, a atualização também acrescentou novas maneiras de importar stickers (figurinhas), novos alertas de segurança e backgrounds animados, entre outras inovações.