No último post sobre este assunto, falei-vos um bocado de código Kotlin em relação à fragment dos idosos. Agora vou falar provavelmente do detalhe maior do projeto. O calendário da ActivityFragment.
Antes de mais, esta fragment permite visualizar as participações de cada idoso num determinado dia. As participações são o conjunto de atividades que eles participam a cada dia: ginástica, relaxamento e TIC(Informática). O negócio dessa instituição é ainda maior visto que eles fazem também música, visitas a locais, praia e entre outras atividades. Mas podem ser registadas no campo de outras informações.
Passemos à parte do calendário.
Tive uma ideia de fazer um calendário horizontal. A primeira coisa que eu fiz foi verificar a documentação do Android, o chamado CalendarView. Este é o objeto padrão que permite visualizar um calendário no entanto, nativamente não suporta a visualização horizontal. Então aqui tive de partir para a investigação. Eu sabia que isso era possível, porque já tinha visto isso na aplicação do calendário do meu telemóvel. Então, pensei assim:
"Alguém já deve ter feito isto e já deve existir bibliotecas que permitam fazer isto."
"Alguém já deve ter feito isto e já deve existir bibliotecas que permitam fazer isto."
A primeira biblioteca que eu achei foi esta:
devs.mulham.horizontalcalendar: GitHub - muraee/Horizontal-Calendar: A material horizontal calendar view for Android based on RecyclerView
devs.mulham.horizontalcalendar: GitHub - muraee/Horizontal-Calendar: A material horizontal calendar view for Android based on RecyclerView
Se lerem a documentação verificam que o último commit dado para este objeto é de 2019. Estamos em que ano ? Em 2023. Muita coisa ficou deprecada até lá.
O RecyclerView agora utiliza o AndroidX e não o android.v7. Muita diferença existe.
Então e agora ? Se a biblioteca não funciona não consigo implementar.
Já vos expliquei num dos posts sobre Clean Architecture que na realidade as bibliotecas são dependências externas e o que importa é o domínio e as regras de negócio. Neste caso ela não funciona mesmo que eu quisesse que funcionasse, então, teria de reescrever a biblioteca para suportar as versões mais recentes. Mas isso seria pegar no repositório Git do autor e modificar o código, ao qual eu não posso modificar sem a sua autorização e dar pull request.
Mas não optei por fazer isso e decidi aprender a criar um calendário horizontal de raiz com a RecyclerView. Se lerem a documentação do calendário, poderão verificar que o calendário usa um RecyclerView então torna-se óbvio que este calendário visto neste repositório foi baseado em qualquer coisa. Vejamos o YouTube. O primeiro vídeo que eu encontrei interessante sobre esta temática foi o vídeo do canal do Alan Hill: Creating an Android INFINITE Scrolling HORIZONTAL Calendar in Kotlin
Ao assistirem ao vídeo ele explica-vos a lógica de como criar o calendário. Ele gera as datas desde 1970. Mas vocês vão acabar por se aperceber que vocês estão a armazenar as datas todas desde 1970. Estamos em que ano ? 2023.
Ou seja, imaginem em 2050, se existir Android, o quantas datas ele vai carregar quantos gigabytes da memória RAM os dados vão ocupar.
Então eu aproveitei a solução deste tutorial, no entanto existe ainda outro problema. O que ele usou neste tutorial, está totalmente deprecado. Está a usar o Paging2 do Android e isso está totalmente deprecado nos dias de hoje. Então, andei à luta com o ChatGPT para ele me converter automaticamente a solução dele para o Paging 3 e eis o que ele me gerou:
A vantagem desta solução é gerar os dias para frente no entanto ele não gera os dias para trás. Então, pedi ao ChatGPT para ele me gerar os dias para trás:
Desta forma este calendário permite mudar de mês e colocar no anterior e no próximo sem dificuldade nenhuma e a funcionalidade anterior mantém-se
Testando o código verifiquei que a aplicação bloqueava e não tinha jeito nenhum de dar. Ou seja um ANR (Application not responding)
Então tomei uma decisão. Gerar apenas as duas semanas anteriores e a semana seguinte. No entanto outro problema a nível de negócio se colocava. E se o utilizador quisesse ver as participações de agosto, por exemplo ?
A minha ideia inicial era criar uma Activity que permitisse listar as participações agrupadas por semana. No entanto teria de criar mais uma view. Este problema não tinha solução, até hoje.
Encontrei um artigo num site chamado Medium que ensina a fazer um calendário:
Horizontal Calendar Using Recylerview Android | by Tejas Soni | Medium
Horizontal Calendar Using Recylerview Android | by Tejas Soni | Medium
Este calendário usa a estrutura de dados Calendar do Java para gerar os meses. Ou seja resolvia o problema de negócio e resolvia-me o problema dos dias infinitos.
O resultado final foi este:
Os dois problemas foram resolvidos.
Em suma, desta história, a lição mais importante é basear-nos em coisas que já existem. Não vamos inventar a roda novamente, o mais provável é termos de adaptar a solução encontrada ao contexto de negócio e ao contexto técnico do software.