James – Um Gerenciador de Tarefas Inteligente

Há alguns (vários) anos eu tive uma idéia de um aplicativo para celular que parecia inovadora: uma geo agenda ou agenda geolocalizada. O que seria isso? Uma agenda de compromissos onde você poderia associar um compromisso a um local e o celular lhe avisaria do compromisso ou tarefa quando você estivesse naquele local específico! Se pararmos para pensar nas agendas tradicionais, elas são um tanto burras, pois somente relacionam um compromisso ou tarefa a uma data ou horário, mas e quando um compromisso está relacionado a um local?

A idéia seria ter um aplicativo onde você pudesse anotar as tarefas e locais, por exemplo, a medida que você vai lembrando de coisas para comprar no supermercado, você vai inserindo na tarefa de supermercado, você lembrou de algo para comprar na loja de ferragens, anota na tarefa relacionada a ela e por aí vai. No dia em que você passar numa loja de ferragens, o aplicativo irá detectar isso e irá mostrar todos os itens que você anotou para comprar lá! Não seria legal? A mesma coisa com supermercados, lojas ou qualquer outro local, inclusive a sua casa ou o seu trabalho! Você poderia criar um compromisso associado ao trabalho e o app somente iria lembrá-lo quando você estivesse no trabalho!

Infelizmente na época a tecnologia não permitiu que a idéia fosse adiante, seja pela precariedade dos sistemas operacionais (Android 1.6 e 2.1, com severas limitações), seja pelo consumo elevado de bateria nos dispositivos de geo localização então existes (GPS), seja pela minha própria limitação na programação de plataformas celulares.

O fato é que a idéia acabou esquecida, mas felizmente guardada em alguma região do meu cérebro, por alguns anos…

Eis que, em 20/04/2015, num restaurante japonês aqui de Joinville, juntamente com a minha esposa Débora, minha irmã Cristiane e sua companheira (atualmente esposa) Isabelli, após algumas horas de uma conversa muito agradável (e vários Sushis, Sashimis, Rolls e Vulcanos), o assunto acabou indo para aplicativos de celular. Conversamos sobre várias idéias e inclusive minhas pretenções de um dia desenvolver um game. Foi aí que aquela idéia já esquecida emergiu novamente: a agenda geo localizada! Imediatamente as idéias começaram a fervilhar na minha cabeça e quase que instantaneamente percebi que todos aqueles aspectos que antes haviam impedido a idéia de prosperar, hoje estavam completa ou quase completamente superados!

E mais, graças a grande difusão de sistemas WiFi, o aplicativo poderia reconhecer os locais através das redes WiFi existentes (já que em muitas situações o GPS ainda não funciona 100%)!

Após aquele jantar, retornamos para casa e imediatamente passei a pesquisar sobre como implementar o aplicativo (a minha esposa Débora que o diga, obrigado pela sua compreensão meu amor!).

Inicialmente (e felizmente, conforme vou expor mais adiante) optei por desenvolver para Android, pois esta é a plataforma que utilizo no meu celular (na época um Moto X 2a geração). Claro que a idéia seria partir para outras plataformas no futuro, por isso o meu foco era utilizar um ambiente que permitisse mais facilmente a migração. Acabei optando pelo Xamarin, um sistema baseado em IDE e C# que permite escrever código portável (dentro de alguns limites) para plataformas Android, iOS e Windows.

No entanto, após algumas semanas pesquisando e testando as funcionalidades do Xamarin, percebi que o meu app iria necessitar de uma arquitetura baseada em um serviço rodando permanentemente em background e no Xamarin, estavam ocorrendo alguns leaks de memória cuja origem eu não compreendia (em parte por eu não ser um programador C#, em parte por eu não ser um programador Android, ou seja, eu não tinha certeza do que estava ocorrendo exatamente).

Assim, de forma a descartar variáveis desconhecidas (já que o Xamarin utiliza um interpretador C# e poderia ser ele o causador dos leaks de memória) acabei abandonando completamente a ideia de utilizar o Xamarin e passei a focar no desenvolvimento no Android Studio do Google.

Pois bem, após cerca de três meses de desenvolvimento (partindo da idéia original relembrada em 20/04/2015), as primeiras funcionalidades do aplicativo já estavam operacionais: o detector de WiFi podia reconhecer redes, detectar a ausência ou presença de redes marcadas, etc. Com o avanço da codificação do app, estava surgindo a necessidade de batizá-lo! Inicialmente as primeiras idéias eram siglas descrevendo o aplicativo (os engenheiros que me lêem provavelmente vão se identificar comigo!), mas após pensar em diversas siglas, percebi que isso seria muito técnico e o app não era técnico.

Passei então a pensar em nomes, um nome que me veio a mente desde o início foi Jarvis (sim, o computador/assistente do Homem de Ferro). O nome não é ruim, mas percebi que já haviam alguns aplicativos com esse nome no Google Play e também não queria criar algum possível problema com a Marvel. Além disso, ao mesmo tempo em que pensava num nome, também pensava num logo que fosse simples e discreto.

Após alguns dias, surgiu o nome James, um nome de boa sonoridade e que já foi bastante utilizado no cinema e TV na associação com mordomos e assistentes. Alfred (o mordomo do Bruce Wayne) também seria uma opção, mas soava mais complexo do que eu gostaria. Então estava decidido, o aplicativo seria chamado James!

Bom, daí em diante o trabalho foi enorme e cada etapa vencida foi devidamente comemorada. É importante notar que o James utiliza muitas funcionalidades que eu nunca havia trabalhado. Assim, a primeira vez em que consegui salvar os locais no banco de dados interno (SQLite) do Android, foi uma vitória! (Antes disso, os locais eram hardcoded em listas Java). Da mesma forma, quando consegui criar um webservice completo (incluindo JSON, código PHP e setup MySQL no lado do servidor e JSON + serviços HTTP no app) foi quase que inacreditável.

O alfa teste fechado do James teve início em 21/08/2015, seguido por um beta teste em 25/09/2015 e lançamento oficial em 07/10/2015 (o que coincidiu propositalmente com a data do meu aniversário 🙂 e com a publicação de uma matéria no jornal A Notícia).

Hoje, passados quase três meses do lançamento, posso dizer que o app evoluiu muito! As críticas recebidas dos usuários foram ouvidas e, na medida do possível, implementadas, a interface com o usuário foi retrabalhada, modernizada, mais bonita e agradável.

O sistema de localização também evoluiu e hoje o James utiliza um sistema híbrido baseado em WiFi/GPS/Redes que permite identificar locais tanto pela configuração de rede WiFi (utilizando o SSID/BSSID) quanto pelas coordenadas geográficas da localização do estabelecimento. Uma característica importante do sistema de localização do James é que ele funciona de forma totalmente offline, ou seja, não depende de conexão com a internet para determinar a posição do usuário. De fato, o app todo foi projetado de forma a não necessitar de conexão permanente com a internet! Esta característica somente será alterada quando uma futura versão do James permitir o compartilhamento em tempo real de tarefas.

O consumo de energia também é um grande foco, pois ninguém quer utilizar um aplicativo devorador de bateria! As versões iniciais do James, que utilizavam apenas localização por WiFi consumiam moderadamente a bateria, mas a inclusão do modo híbrido trouxe novos desafios, pois o consumo do GPS é substancialmente maior que o do WiFi. Para reduzir o consumo de energia no modo híbrido, as novas versões do James implementam modos de economia de energia, que detectam quando o aparelho está inativo e desativam momentaneamente a localização. O consumo de energia também foi reduzido através de algoritmos que somente utilizam o GPS quando estritamente necessário.

O lançamento da versão 6.0 do Android (Marshmallow) trouxe alguns novos desafios pois os novos modos IDLE e DOZE de economia de bateria interferem diretamente na operação do app. Na verdade a versão 5.0 também trouxe desafios, me recordo de um em particular que foi a modificação (não documentada na época) do método setRepeating da classe AlarmManager: até a versão 5.0 era possível setar um tempo de alarme repetitivo de poucos segundos, mas a partir da versão 5.0, o tempo mínimo passou a ser de 60 segundos. Nem preciso dizer que o James utiliza tempos inferiores a 60 segundos para a varredura do WiFi. O resultado foi que do dia para a noite (após a atualização do meu Moto X do Android 4.4 para a versão 5.0) o James passou a se comportar de forma estranha. Levou algum tempo até perceber que o funcionamento do método havia sido alterado pelo Google…

James também possui uma fanpage no Facebook que pode ser acessada aqui. Se você ainda não curtiu o James vá até lá e curta a página! Se você ainda não baixou ou não testou a última versão do James, baixe agora no Google Play, afinal o app é totalmente gratuito!

Para encerrar este post, coloco abaixo algumas imagens da versão 1.3 do app.

tarefas_azuliconeslocaistarefa_novatarefas_preto

Leave a Reply