https://drive.google.com/file/d/1qpNWJowZQuI55BlgYEV-x7vppG0UGkOO/view?usp=drive_link
- Criar a tela inicial do aplicativo.
- Implementar um botão na tela inicial chamado "Atribuir chave ao cadeado".
- Implementar a funcionalidade de atribuição de uma tag NFC ao cadeado.
- Quando o usuário clicar no botão "Atribuir chave ao cadeado", o app deve permitir que uma tag NFC seja atribuída ao cadeado.
- Após a atribuição da tag NFC, exibir uma mensagem de sucesso: "Chave atribuída com sucesso!".
- Exibir uma imagem ou ícone de um cadeado aberto após a atribuição bem-sucedida.
- Adicionar botões para abrir e fechar o cadeado.
- Implementar um botão para "Fechar Cadeado".
- Implementar um botão para "Abrir Cadeado".
- Solicitar a tag NFC previamente cadastrada ao tentar abrir o cadeado.
- Quando o usuário clicar no botão "Abrir Cadeado", o app deve solicitar a tag NFC atribuída previamente para proceder com a abertura.
- Validar a tag NFC e realizar a abertura do cadeado.
- Ao aproximar a tag NFC correta, o cadeado deve abrir e exibir uma mensagem de sucesso: "Cadeado aberto com sucesso!".
- Se a tag NFC for incorreta, o app deve emitir um som de erro e exibir a mensagem "Chave incorreta!".
- Implementar um contador regressivo para a abertura do cadeado.
- Adicionar um contador regressivo de 30 segundos após a solicitação de abertura do cadeado.
- Se o tempo se esgotar sem que a tag correta seja apresentada, cancelar a ação de abertura do cadeado.
A arquitetura MVVM foi escolhida para separar claramente a lógica de apresentação (View) da lógica de negócios (Model) e da lógica de interação (ViewModel). Abaixo está uma breve explicação das responsabilidades de cada componente:
-
Model: Representa a camada de dados, incluindo fontes locais (banco de dados) e remotas (APIs). Exemplo:
Repository
,DataSource
. -
View: A interface do usuário, que observa o ViewModel e reflete as mudanças no estado da UI. Exemplo:
Activity
,Fragment
. -
ViewModel: Intermediário que fornece dados da Model à View e contém a lógica de apresentação. Mantém o estado da UI e reage às interações do usuário.
Para garantir que o código seja sustentável e fácil de manter, aplicamos os princípios de Clean Code e SOLID:
-
S: Single Responsibility Principle - Cada classe tem uma única responsabilidade.
-
O: Open/Closed Principle - O código está aberto para extensão, mas fechado para modificação.
-
L: Liskov Substitution Principle - As subclasses devem ser substituíveis por suas superclasses.
-
I: Interface Segregation Principle - Múltiplas interfaces específicas são melhores do que uma interface geral.
-
D: Dependency Inversion Principle - Módulos de alto nível não devem depender de módulos de baixo nível, ambos devem depender de abstrações.
Dagger Hilt foi utilizado para gerenciar a injeção de dependência, simplificando o fornecimento e a configuração de dependências dentro do aplicativo:
A integração de NFC foi realizada utilizando componentes nativos do Android:
-
NfcAdapter: Para detectar a presença de dispositivos NFC.
-
PendingIntent e IntentFilter: Para gerenciar as intenções associadas à leitura de tags NFC.