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

Apple terá que pagar R$ 7,7 milhões por falta de tradução de app no Brasil

FaceApp ficou famoso em 2019 por deixar as pessoas mais jovens ou envelhecidas com ajuda de filtros - Kirill KUDRYAVTSEV / AFP
FaceApp ficou famoso em 2019 por deixar as pessoas mais jovens ou envelhecidas com ajuda de filtros Imagem: Kirill KUDRYAVTSEV / AFP

Aurélio Araújo

Colaboração para Tilt

09/06/2021 12h56

A Justiça manteve multa de R$ 7,7 milhões aplicada pelo Procon de São Paulo à Apple, em agosto de 2019, devido à oferta de um aplicativo sem instruções em português na App Store, loja de apps da gigante da tecnologia. O programa em questão é o FaceApp, que ficou famoso por envelhecer as pessoas com inteligência artificial.

À época, o órgão concluiu que tanto a Apple quando o Google, que também disponibiliza o app em sua Play Store, violaram os direitos do consumidor brasileiro por permitir que o FaceApp só exibisse informações em inglês em sua "Política de Privacidade" e nos seus "Termos de Uso".

Consultada por Tilt, a Apple informou que não irá se manifestar. Ainda cabe recurso judicial sobre a decisão.

Disputa judicial

A Apple recorreu da multa, sob justificativa de que não seria responsável pela App Store. De acordo com a empresa norte-americana, sua atividade principal é "venda, importação e exportação de computadores, equipamentos de telecomunicações, multimídia e outros correlatos".

Assim, não se considera responsável pelo "desenvolvimento, distribuição ou oferta" do FaceApp, reconhecendo apenas que ele pode ser baixado em sua loja. Mas que, uma vez que ele foi concebido para pessoas de diversas nacionalidades, não é razoável exigir que todas as informações estivessem traduzidas para todas as línguas.

No entanto, a multa aplicada pelo Procon foi mantida por decisão do juiz Sergio Serrano Nunes Filho, da 1ª Vara da Fazenda Pública de São Paulo. De acordo com a decisão, a Apple é responsável por escolher que aplicativos serão disponibilizados em sua loja e por oferecê-los ao consumidor.

A empresa seria, portanto, "fornecedora" de aplicativos e não a intermediária. O juiz afirmou ainda que, ao atuar no mercado brasileiro, os "Termos de Uso" e "Política de Privacidade" devem constar em português.

Ouvido por Tilt, o diretor-executivo do Procon-SP, Fernando Capez, afirmou que se trata de "uma decisão histórica, na medida em que as plataformas digitais não poderão mais se isentar da responsabilidade pelos produtos e aplicativos que têm em suas prateleiras".

"Pessoas que brincam nesses aplicativos não são informadas que seus dados serão usados pela empresa em outros países, em clara violação às leis de proteção de dados", acrescentou Capez.

O que aconteceu?

A disputa entre Procon-SP, Apple e Google por causa do FaceApp começou há dois anos, quando o órgão notificou as empresas de tecnologia.

A ideia era obter explicações sobre as políticas de armazenamento de dados dos usuários que possuíam o FaceApp instalados em seus smartphones. O Procon-SP afirmava que "a licença para uso do aplicativo contém cláusula que autoriza a empresa a coletar e compartilhar imagens e dados do consumidor, sem explicar de que forma, por quanto tempo e como serão usados. E ainda, essas permissões não estão disponíveis em língua portuguesa".

Pouco depois, insatisfeito com as respostas que obteve, o Procon concluiu que houve violação dos direitos do consumidor e, por isso, decidiu multar as empresas, no valor de R$ 9,9 milhões para o Google e R$ 7,7 milhões para a Apple.

Outras violações

A multa aplicada sobre a empresa que produz o iPhone também levava em conta cláusulas consideradas abusivas pelo Procon.

Uma delas, por exemplo, previa a possibilidade de compartilhar dados do usuário com outras empresas, enquanto outra cláusula estabelecia que esses dados podiam ser transferidos para países sem as mesmas leis de proteção de dados do Brasil.

Além disso, a Apple impunha que conflitos entre seus usuários e as empresas desenvolvedoras de apps não deveriam ser resolvidos pela Justiça. Em vez disso, as disputas seriam levadas a uma arbitragem no Estado da Califórnia, onde fica a sede da Apple.