Oopsie!

Então, parece que o WeightWatch não estava a arrancar hoje de manhã. Deu mais ou menos para perceber logo que era um problema com alguma função que tivesse a ver com as datas, visto que nos encontramos no último dia do mês, e isto dos erros de programação em intervalos de números contínuos costumam ser mais comuns nos limites desses intervalos.

Basta mudar a data do telemóvel andando um dia para trás para confirmar essa teoria — o programa a seguir já corre normalmente.

Primeiro uma pequena explicação sobre como funciona a geração de gráficos. Quando o programa começa, vai buscar a data actual e cria um gráfico para o mês actual. A seguir, o programa subtrai um mês à data actual para criar o gráfico do mês anterior, e adiciona um mês para criar o gráfico do mês seguinte. Assim, quando é preciso mostrar o gráfico do mês ao lado, a imagem já está criada, e, durante os 250 milissegundos que dura a animação da mudança de mês, o programa aproveita para ir gerando o gráfico seguinte de maneira a ter sempre 3 gráficos em memória: o que aparece no ecrã, o anterior e o seguinte.

Ora, o problema que o programa tinha era de que quando é preciso subtrair ou aumentar um mês, estava simplesmente a dizer à biblioteca de datas do Java para me criar uma data nova em que se subtraía ou somava um mês ao mês actual:

calendar.set(Calendar.MONTH, month - 1);

O problema é que a biblioteca do Java não verifica se o dia é válido para o novo mês, como eu pensei que fizesse. Em vez disso, se o dia não for válido, a biblioteca não consegue gerar uma data válida e falha violentamente.

A solução foi simples. Como não precisamos do dia para nada quando estamos a mudar o mês (só interessa o mês), podemos mudar primeiro o dia para um valor inócuo:

calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, month - 1);

Et voila! Já funciona de novo.

O novo executável já se encontra online no sítio do costume. A alternativa é mudar a data do telemóvel temporariamente e iniciar o programa para então fazer uma actualização online.

Como vantagem, a nova compilação já inclui as correcções que tenho estado a fazer ao programa durante os últimos dias, pelo que para além de já não ter este bug horrível, o programa deve funcionar melhor em geral.

WeightWatch 0.9

Após ter publicado a primeira versão do WeightWatch, continuei a trabalhar no programa para corrigir os vários problemas que tinha, e para acrescentar alguma funcionalidade que tinha planeado originalmente.

Muitos dos problemas que tive com a aplicação estavam directamente relacionados com a falta de agilidade proporcionada pela edição do Java para telemóveis. A primeira coisa que fiz depois da publicação do programa foi procurar uma nova biblioteca de interfaces que fosse mais capaz.

A primeira que encontrei, uma das mais populares, foi a J2ME Polish, que apesar de ter um nome foleiro e com um duplo significado ainda mais foleiro, é bastante poderosa e supostamente tem boa integração tanto com o Eclipse como com o NetBeans. Apesar de a instalação da biblioteca no meu ambiente não ter sido fácil, lá consegui pôr tudo a funcionar, e, enquanto foi possível acompanhar os tutoriais com facilidade, o desenvolvimento à base de macros não me agradou muito. Por outro lado, o escopo do Polish é extremamente abrangente, visto que eles praticamente querem substituir todas as bibliotecas de base do J2ME, o que para mim é demais — eu quero uma simples biblioteca que trate do desenho da interface, e que me permita estende-lo à minha vontade.

Foi aqui que encontrei finalmente a minha solução: o LWUIT (Light Weight User Interface Toolkit). Apesar do nome ainda mais foleiro, esta biblioteca é, de facto light weight, no sentido de que basta incluir a biblioteca com o projecto e aceder aos seus métodos para criar uma interface. Para além do mais, a interface pode ser toda personalizada através de ficheiros de temas, que podem ser criados e editados com um pequeno programa fornecido com a biblioteca e a sua funcionalidade pode ser facilmente alterada pegando nos componentes básicos e estendendo-os programaticamente.

Finalmente, e esta é a maior vantagem de todas, a biblioteca está a ser desenvolvida pela SUN (a mesma empresa que inventou e comercializa do Java), pelo que há grandes hipóteses de que venha a fazer parte das próximas versões da linguagem.

As desvantagens de usar este toolkit resumem-se ao facto do ficheiro executável final ficar maior do que o do programa original (entenda-se que a comparação não é completamente justa visto que entretanto implementei muito mais funcionalidade), e ao facto de ainda ser uma biblioteca em desenvolvimento, pelo que por vezes podemos ficar sujeitos a bugs ou falta de funcionalidade numa determinada função.

O facto de estar em desenvolvimento tem, no entanto, coisas boas, visto que os programadores estão a trabalhar activamente na biblioteca. Nesta versão 0.9 do WeightWatch já inclui algumas funcionalidades que tiveram origem em pedidos feitos directamente à equipa de desenvolvimento, e respondidos em menos de um dia.

No entanto, a melhor das novas funcionalidades é o facto de se poder actualizar online, para quem tiver maneira de aceder à internet através do telemóvel. Através deste sistema já não vai ser preciso acompanhar este blog para saber quando há novas versões disponíveis, e fica até mais fácil corrigir pequenos bugs daqueles que não matam mas moem.

Portanto aqui está o novo WeightWatch 0.9. A um ponto decimal de se tornar uma versão final — para isso ainda lhe faltam correcções a dois ou três bugs, e possivelmente traduções para várias línguas.

O software é open source, e, para quem quiser participar no desenvolvimento, aqui está a página do projecto.