;(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

Esse conteúdo é antigo

STJ nega pedido para interromper monitoramento de celulares em SP

Imagem do monitoramento por celular feito pela empresa de geolocalização In Loco - Divulgação/In Loco
Imagem do monitoramento por celular feito pela empresa de geolocalização In Loco Imagem: Divulgação/In Loco

Do UOL, em São Paulo

17/04/2020 18h47

A ministra do Superior Tribunal de Justiça (STJ), Laurita Vaz, negou um pedido para que o monitoramento de celulares, utilizado pelo Governo do Estado de São Paulo para observar o cumprimento do isolamento social, fosse interrompido. A medida, batizada de Simi (Sistema de Monitoramento Inteligente), foi adotada ao longo da semana como forma de combate à pandemia de coronavírus.

Laurita Vaz argumentou que tanto o governo estadual quanto as operadoras de celular afirmaram que o sistema não permite a individualização dos dados dos usuários e que, portanto, não é possível identificar quem são as pessoas potencialmente atingidas pelo monitoramento.

A magistrada também observou que a adoção do isolamento domiciliar não foi adotada em São Paulo em função da parceria com as operadoras de telefonia.

"Ou seja, não foram apontados quaisquer atos objetivos que possam causar, direta ou indiretamente, perigo ou restrição à liberdade de locomoção no caso", escreveu ela.

O estado de São Paulo começou a usar o serviço a partir da quinta-feira da semana ada e já divulgou que pretende ampliar sua utilização. Atualmente, as 47 cidades paulistas com 200 mil moradores ou mais têm os deslocamentos da população acompanhados. A intenção do governo que municípios menores, com 30 mil habitantes ou mais, também sejam monitorados.

Como funciona?

O monitoramento mede a concentração de pessoas em uma região, percebendo quais aparelhos estão conectados às suas antenas. Para medir o deslocamento de um lugar a outro, elas verificam os celulares que em um certo período se conectaram a diferentes estações de radiobase (ERB).

A partir daí, as empresas criam "manchas de calor" das regiões que apresentam maior aglomeração de pessoas e outras "manchas" que mostram apenas o deslocamento de usuários. Como cada operadora só monitora seus clientes, todas devem atuar em conjunto para se obter o panorama do isolamento.

Governo faz proposta, mas volta atrás

Nesta semana, o Planalto desistiu de usar o sistema que monitora o percentual de pessoas que está aderindo ao isolamento social, algo que vinha sendo negociado pelo Ministério da Ciência e Tecnologia com as operadoras de telefonia desde o começo do mês.

Segundo o jornal O Globo, no último sábado (11), o presidente Jair Bolsonaro (sem partido) ligou para o ministro da Ciência e Tecnologia, Marcos Pontes, e determinou a suspensão do serviço. A justificativa para o adiamento foi verificar se o sistema não desrespeita o sigilo dos dados das pessoas

No entanto, uma semana antes, o próprio site da Agência Brasil, de propriedade do poder Executivo, publicou que o país contaria com o monitoramento e ressaltou que as regras da Lei Geral de Proteção de Dados e do Marco Civil da Internet seriam respeitadas.