From 0c54f9a9cc57737bea4cec5a3d990bc410554fdd Mon Sep 17 00:00:00 2001 From: 230410 <230410@epvc.pt> Date: Fri, 12 Dec 2025 10:22:34 +0000 Subject: [PATCH] first commit --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/.name | 1 + .idea/AndroidProjectSystem.xml | 6 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 18 + .idea/deviceManager.xml | 13 + .idea/gradle.xml | 19 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .idea/runConfigurations.xml | 17 + .idea/studiobot.xml | 6 + .idea/vcs.xml | 6 + ADICIONAR_LOGO.md | 119 +++ COMO_USAR.md | 172 ++++ FIREBASE_SETUP.md | 93 ++ app/.gitignore | 1 + app/build.gradle.kts | 51 + app/google-services.json | 29 + app/proguard-rules.pro | 21 + .../example/bem/ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 64 ++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 156536 bytes .../java/com/example/bem/AlarmReceiver.java | 119 +++ .../com/example/bem/AlarmRingingActivity.java | 121 +++ .../com/example/bem/AlarmSoundService.java | 201 ++++ .../com/example/bem/InviteCodeActivity.java | 248 +++++ .../java/com/example/bem/LoginActivity.java | 340 +++++++ .../java/com/example/bem/MainActivity.java | 932 ++++++++++++++++++ app/src/main/res/drawable/bg_alarm_card.xml | 14 + app/src/main/res/drawable/bg_avatar.xml | 13 + app/src/main/res/drawable/bg_bottom_bar.xml | 9 + .../res/drawable/bg_calendar_day_selected.xml | 13 + app/src/main/res/drawable/bg_chip.xml | 11 + app/src/main/res/drawable/bg_day_chip.xml | 10 + app/src/main/res/drawable/bg_dot.xml | 6 + .../main/res/drawable/bg_guardian_card.xml | 13 + .../main/res/drawable/bg_guardian_chip.xml | 10 + .../main/res/drawable/bg_guardian_hero.xml | 13 + .../main/res/drawable/bg_header_gradient.xml | 10 + app/src/main/res/drawable/bg_hero_card.xml | 14 + app/src/main/res/drawable/bg_icon_button.xml | 10 + app/src/main/res/drawable/bg_new_button.xml | 15 + .../main/res/drawable/bg_reminder_card.xml | 13 + .../main/res/drawable/bg_reminder_hero.xml | 13 + .../res/drawable/bg_reminder_info_card.xml | 10 + app/src/main/res/drawable/bg_search.xml | 19 + app/src/main/res/drawable/bg_service_card.xml | 19 + app/src/main/res/drawable/bg_service_icon.xml | 10 + .../main/res/drawable/bg_service_icon_alt.xml | 10 + app/src/main/res/drawable/bg_tab_active.xml | 10 + .../res/drawable/ic_launcher_background.xml | 74 ++ .../res/drawable/ic_launcher_foreground.xml | 30 + app/src/main/res/drawable/logo_bem_temp.xml | 23 + .../res/layout/activity_alarm_ringing.xml | 111 +++ .../main/res/layout/activity_invite_code.xml | 148 +++ app/src/main/res/layout/activity_login.xml | 150 +++ app/src/main/res/layout/activity_main.xml | 154 +++ app/src/main/res/layout/dialog_add_alarm.xml | 143 +++ app/src/main/res/layout/item_alarm_card.xml | 116 +++ app/src/main/res/layout/item_calendar_day.xml | 32 + app/src/main/res/layout/layout_tab_alarms.xml | 173 ++++ .../main/res/layout/layout_tab_calendar.xml | 175 ++++ .../main/res/layout/layout_tab_guardians.xml | 692 +++++++++++++ .../main/res/layout/layout_tab_reminders.xml | 411 ++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 3066 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 9456 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 4958 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1878 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 4966 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 4600 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 14594 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 7440 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 8304 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 25324 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 13416 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 12394 bytes .../ic_launcher_foreground.webp | Bin 0 -> 37266 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 19552 bytes app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values/colors.xml | 22 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 9 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../java/com/example/bem/ExampleUnitTest.java | 17 + build.gradle.kts | 14 + gradle.properties | 21 + gradle/libs.versions.toml | 24 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++ gradlew.bat | 89 ++ settings.gradle.kts | 23 + 97 files changed, 5827 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/AndroidProjectSystem.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/deviceManager.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/studiobot.xml create mode 100644 .idea/vcs.xml create mode 100644 ADICIONAR_LOGO.md create mode 100644 COMO_USAR.md create mode 100644 FIREBASE_SETUP.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/google-services.json create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/bem/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/example/bem/AlarmReceiver.java create mode 100644 app/src/main/java/com/example/bem/AlarmRingingActivity.java create mode 100644 app/src/main/java/com/example/bem/AlarmSoundService.java create mode 100644 app/src/main/java/com/example/bem/InviteCodeActivity.java create mode 100644 app/src/main/java/com/example/bem/LoginActivity.java create mode 100644 app/src/main/java/com/example/bem/MainActivity.java create mode 100644 app/src/main/res/drawable/bg_alarm_card.xml create mode 100644 app/src/main/res/drawable/bg_avatar.xml create mode 100644 app/src/main/res/drawable/bg_bottom_bar.xml create mode 100644 app/src/main/res/drawable/bg_calendar_day_selected.xml create mode 100644 app/src/main/res/drawable/bg_chip.xml create mode 100644 app/src/main/res/drawable/bg_day_chip.xml create mode 100644 app/src/main/res/drawable/bg_dot.xml create mode 100644 app/src/main/res/drawable/bg_guardian_card.xml create mode 100644 app/src/main/res/drawable/bg_guardian_chip.xml create mode 100644 app/src/main/res/drawable/bg_guardian_hero.xml create mode 100644 app/src/main/res/drawable/bg_header_gradient.xml create mode 100644 app/src/main/res/drawable/bg_hero_card.xml create mode 100644 app/src/main/res/drawable/bg_icon_button.xml create mode 100644 app/src/main/res/drawable/bg_new_button.xml create mode 100644 app/src/main/res/drawable/bg_reminder_card.xml create mode 100644 app/src/main/res/drawable/bg_reminder_hero.xml create mode 100644 app/src/main/res/drawable/bg_reminder_info_card.xml create mode 100644 app/src/main/res/drawable/bg_search.xml create mode 100644 app/src/main/res/drawable/bg_service_card.xml create mode 100644 app/src/main/res/drawable/bg_service_icon.xml create mode 100644 app/src/main/res/drawable/bg_service_icon_alt.xml create mode 100644 app/src/main/res/drawable/bg_tab_active.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/logo_bem_temp.xml create mode 100644 app/src/main/res/layout/activity_alarm_ringing.xml create mode 100644 app/src/main/res/layout/activity_invite_code.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/dialog_add_alarm.xml create mode 100644 app/src/main/res/layout/item_alarm_card.xml create mode 100644 app/src/main/res/layout/item_calendar_day.xml create mode 100644 app/src/main/res/layout/layout_tab_alarms.xml create mode 100644 app/src/main/res/layout/layout_tab_calendar.xml create mode 100644 app/src/main/res/layout/layout_tab_guardians.xml create mode 100644 app/src/main/res/layout/layout_tab_reminders.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/example/bem/ExampleUnitTest.java create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..092cff1 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Bem+ \ No newline at end of file diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..afe9e82 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..639c779 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/studiobot.xml b/.idea/studiobot.xml new file mode 100644 index 0000000..539e3b8 --- /dev/null +++ b/.idea/studiobot.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ADICIONAR_LOGO.md b/ADICIONAR_LOGO.md new file mode 100644 index 0000000..ddcd882 --- /dev/null +++ b/ADICIONAR_LOGO.md @@ -0,0 +1,119 @@ +# 🎨 Como Adicionar o Logo Bem+ à App + +## 📍 Passo 1: Preparar a Imagem do Logo + +Precisa do logo em **diferentes tamanhos** para Android: + +### Tamanhos necessários: +- **mdpi**: 48x48 px +- **hdpi**: 72x72 px +- **xhdpi**: 96x96 px +- **xxhdpi**: 144x144 px +- **xxxhdpi**: 192x192 px + +### 🔧 Opção A: Gerar automaticamente (RECOMENDADO) + +1. Vá para [icon.kitchen](https://icon.kitchen) ou [appicon.co](https://appicon.co) +2. Faça upload da imagem do logo Bem+ +3. Escolha **"Android"** +4. Download do pacote ZIP com todos os tamanhos +5. Descompacte o ZIP + +### 🔧 Opção B: Android Studio (MAIS FÁCIL) + +1. Abra o projeto no Android Studio +2. Clique direito em `app/src/main/res` +3. **"New"** → **"Image Asset"** +4. **"Icon Type"**: Launcher Icons (Adaptive and Legacy) +5. **"Path"**: Selecione a imagem do logo +6. **"Name"**: `ic_launcher` +7. Clique **"Next"** → **"Finish"** +8. ✅ Android Studio gera TODOS os tamanhos automaticamente! + +--- + +## 📍 Passo 2: Colocar os Ficheiros nas Pastas Corretas + +### Se usou ferramentas online (Opção A): + +Copie os ficheiros para: + +``` +/Users/230410/AndroidStudioProjects/Bem/app/src/main/res/ + +mipmap-mdpi/ + └── ic_launcher.png (48x48) + +mipmap-hdpi/ + └── ic_launcher.png (72x72) + +mipmap-xhdpi/ + └── ic_launcher.png (96x96) + +mipmap-xxhdpi/ + └── ic_launcher.png (144x144) + +mipmap-xxxhdpi/ + └── ic_launcher.png (192x192) +``` + +### Também substitua os ícones redondos: + +``` +mipmap-mdpi/ + └── ic_launcher_round.png + +mipmap-hdpi/ + └── ic_launcher_round.png + +(... mesmos tamanhos que acima) +``` + +--- + +## 📍 Passo 3: Logo para usar DENTRO da App + +Para mostrar o logo nas telas internas: + +1. Pegue a imagem em **alta resolução** (pelo menos 512x512) +2. Renomeie para: `logo_bem.png` +3. Cole em: + ``` + /Users/230410/AndroidStudioProjects/Bem/app/src/main/res/drawable/logo_bem.png + ``` + +--- + +## ✅ Verificar no Terminal + +Depois de adicionar, execute: + +```bash +cd /Users/230410/AndroidStudioProjects/Bem +ls -la app/src/main/res/mipmap-xhdpi/ic_launcher.png +ls -la app/src/main/res/drawable/logo_bem.png +``` + +Se os ficheiros aparecerem, está tudo correto! ✓ + +--- + +## 🚀 Já Preparei o Código! + +Quando adicionar as imagens, a app VAI USAR AUTOMATICAMENTE: + +### Nas telas internas: +- ✅ Tela de login +- ✅ Cabeçalho da aba Alarmes +- ✅ Activity de alarme a tocar +- ✅ Diálogos + +### Como ícone da app: +- ✅ Ecrã principal (launcher) +- ✅ Notificações +- ✅ Recentes/multitarefa + +**Não precisa programar nada!** Só adicionar as imagens. 🎉 + + + diff --git a/COMO_USAR.md b/COMO_USAR.md new file mode 100644 index 0000000..61ca3b8 --- /dev/null +++ b/COMO_USAR.md @@ -0,0 +1,172 @@ +# 📱 Bem+ - Guia de Utilização Completo + +## 🎯 Visão Geral + +A app **Bem+** é um sistema completo de gestão de medicação para idosos com controlo parental integrado. + +--- + +## 👤 PARA UTILIZADORES (Idosos) + +### 1️⃣ Primeiro Acesso + +1. Abra a app +2. Toque em **"Registar"** +3. Preencha: + - Nome completo + - Email + - Palavra-passe (mínimo 6 caracteres) +4. Toque em **"Criar Conta"** + +### 2️⃣ Criar Alarmes + +1. Na aba **"Alarmes"** (sino verde) +2. Toque no botão **"+ Novo"** +3. Configure: + - Nome do medicamento (ex: Aspirina) + - Horário (toque para escolher com picker) + - Dosagem (ex: 100mg • Segunda a Sexta) +4. Toque **"Guardar"** +5. ✅ Alarme criado e agendado! + +### 3️⃣ Editar Alarmes + +Toque no ícone do **lápis** ✏️ em qualquer alarme: + +- **⏰ Alterar horário** - Mude a hora +- **🔔 Escolher toque** - Escolha som dos toques do telemóvel +- **🎵 Testar toque atual** - Ouve 5 segundos de pré-visualização +- **📝 Editar título** - Renomeie o medicamento + +### 4️⃣ Quando o Alarme Toca + +O ecrã liga automaticamente e mostra: + +- 💊 Nome do medicamento +- 🕐 Hora atual +- **⏰ Adiar 5min** - Toca novamente em 5 minutos +- **✓ Parar** - Para o alarme + +### 5️⃣ Confirmar que Tomou + +Em cada alarme, toque no botão **"✓ Confirmar"**: +- Regista a hora exata +- Notifica o responsável automaticamente +- Botão muda para **"✓ Tomado"** (cinza) +- Reseta amanhã + +### 6️⃣ Adicionar Responsável + +1. Toque no ícone de **⚙️ Configurações** (canto superior direito) +2. Escolha **"🎟️ Gerar código para responsável"** +3. Partilhe o código de **6 dígitos** com o responsável +4. ⏱️ **Válido por 30 segundos!** + +--- + +## 👨‍⚕️ PARA RESPONSÁVEIS + +### 1️⃣ Criar Conta de Responsável + +1. Na tela de login, toque em **"🔒 Sou Responsável"** +2. Toque em **"Registar"** +3. Preencha: + - Nome completo + - Email + - Palavra-passe + - Número de telemóvel +4. Toque em **"Criar Conta"** + +### 2️⃣ Vincular a um Utilizador + +Após criar conta: + +1. Peça ao utilizador para gerar um código +2. Na tela de código, insira o código de **6 dígitos** +3. Toque **"Vincular Responsável"** +4. ✅ Vinculado com sucesso! + +### 3️⃣ Monitorizar Medicação + +Aceda à aba **"Responsáveis"** (escudo roxo): + +**Dashboard em tempo real:** +- **Tomados**: Quantos medicamentos foram confirmados hoje +- **Pendentes**: Quantos ainda faltam +- **Adesão**: Percentagem de cumprimento + +**Lista detalhada:** +- ✅ **"✓ Tomado às 14:32"** (verde) - Confirmado +- ⚠️ **"⚠ Pendente"** (vermelho) - Ainda não tomou + +--- + +## 🔐 Segurança + +### Recuperar Palavra-passe + +1. Na tela de login, toque em **"Esqueci-me da palavra-passe"** +2. Insira o email +3. Toque **"Enviar"** +4. Verifique o email com link de recuperação + +### Múltiplos Responsáveis + +- Um utilizador pode ter **vários responsáveis** +- Cada responsável vê os mesmos dados +- Todos recebem notificações de confirmação + +### Códigos Temporários + +- ⏱️ Válidos por **30 segundos** +- 🔒 Uso único (não pode ser reutilizado) +- 🎲 Aleatórios de 6 dígitos +- ♻️ Pode gerar novos códigos ilimitadamente + +--- + +## 🎨 Abas da App + +### 🔔 Alarmes +- Criar, editar e apagar alarmes +- Confirmar tomada de medicamentos +- Escolher toques personalizados + +### 💚 Lembretes +- Dicas inteligentes baseadas no clima +- Sugestões de atividades +- Sistema contextual automático + +### 🛡️ Responsáveis (Controlo Parental) +- Monitorização em tempo real +- Histórico de medicações +- Estatísticas de adesão +- **Só acessível por responsáveis autenticados!** + +--- + +## ⚡ Dicas + +- 🔊 **Toques tocam MUITO ALTO** - Use volume máximo do canal de alarme +- 🔋 **Vibração otimizada** - Padrão intermitente poupa bateria +- 📱 **Funciona mesmo bloqueado** - Ecrã liga automaticamente +- ☁️ **Dados na cloud** - Firebase sincroniza tudo + +--- + +## 🆘 Problemas Comuns + +**"Alarme não toca"** +→ Verifique permissões de notificação e alarmes exatos + +**"Código expirou"** +→ São só 30 segundos! Gere novo código + +**"Não consigo entrar no Controlo Parental"** +→ Só responsáveis registados têm acesso + +**"Esqueci-me da palavra-passe"** +→ Use "Recuperar palavra-passe" com o email + + + diff --git a/FIREBASE_SETUP.md b/FIREBASE_SETUP.md new file mode 100644 index 0000000..f7b1ad5 --- /dev/null +++ b/FIREBASE_SETUP.md @@ -0,0 +1,93 @@ +# 🔥 Configuração do Firebase para Bem+ + +## Passo 1: Criar Projeto no Firebase Console + +1. Aceda a [console.firebase.google.com](https://console.firebase.google.com) +2. Clique em **"Adicionar projeto"** +3. Nome do projeto: **Bem Plus** (ou outro à escolha) +4. Desative Google Analytics (opcional) +5. Clique em **"Criar projeto"** + +## Passo 2: Adicionar App Android + +1. No painel do projeto, clique no ícone **Android** (robô verde) +2. **Nome do pacote**: `com.example.bem` +3. **Nome da app**: `Bem+` +4. Clique em **"Registar app"** + +## Passo 3: Transferir google-services.json + +1. Faça download do ficheiro **google-services.json** +2. Cole o ficheiro em: + ``` + /Users/230410/AndroidStudioProjects/Bem/app/google-services.json + ``` +3. **IMPORTANTE**: O ficheiro DEVE estar dentro da pasta `app/` + +## Passo 4: Ativar Authentication + +1. No menu lateral, clique em **"Authentication"** +2. Clique em **"Começar"** +3. Ative o método: **"Email/Password"** +4. Clique em **"Ativar"** e depois **"Guardar"** + +## Passo 5: Ativar Firestore Database + +1. No menu lateral, clique em **"Firestore Database"** +2. Clique em **"Criar base de dados"** +3. Selecione **"Modo de teste"** (permite leitura/escrita por 30 dias) +4. Localização: **"europe-west1"** (Frankfurt - mais próximo de Portugal) +5. Clique em **"Ativar"** + +## Passo 6: Configurar Regras de Segurança (Opcional mas recomendado) + +No Firestore, vá para **"Regras"** e cole: + +```javascript +rules_version = '2'; +service cloud.firestore { + match /databases/{database}/documents { + match /users/{userId} { + allow read, write: if request.auth != null && request.auth.uid == userId; + allow read: if request.auth != null && + request.auth.uid in resource.data.guardians; + } + + match /inviteCodes/{code} { + allow read, write: if request.auth != null; + allow delete: if false; + } + } +} +``` + +Clique em **"Publicar"**. + +## Passo 7: Compilar a App + +Após seguir TODOS os passos acima: + +```bash +cd /Users/230410/AndroidStudioProjects/Bem +./gradlew assembleDebug +``` + +## ✅ Verificação + +Se tudo estiver correto: +- ✅ Ficheiro `google-services.json` na pasta `app/` +- ✅ Authentication ativo com Email/Password +- ✅ Firestore Database criado +- ✅ Build sem erros + +## 🚀 Pronto! + +A app agora tem: +- 🔐 Login/Registo de utilizadores +- 👥 Login de responsáveis +- 🎟️ Códigos temporários de 30 segundos +- 🔄 Recuperação de palavra-passe +- 📊 Painel de monitorização protegido + + + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..8db86d3 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + alias(libs.plugins.android.application) + id("com.google.gms.google-services") +} + +android { + namespace = "com.example.bem" + compileSdk = 36 + + defaultConfig { + applicationId = "com.example.bem" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + + implementation(libs.appcompat) + implementation(libs.material) + implementation(libs.activity) + implementation(libs.constraintlayout) + + // Firebase + implementation(platform("com.google.firebase:firebase-bom:32.7.0")) + implementation("com.google.firebase:firebase-auth") + implementation("com.google.firebase:firebase-firestore") + implementation("com.google.firebase:firebase-analytics") + + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..3a8ec62 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "785325517224", + "project_id": "bem-firebase", + "storage_bucket": "bem-firebase.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:785325517224:android:705886336a3809fc3f159d", + "android_client_info": { + "package_name": "com.example.bem" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAe0XbtC_eQY93MWyWzu8I_d1ALOZkBDgQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/bem/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/bem/ExampleInstrumentedTest.java new file mode 100644 index 0000000..c1d5ddc --- /dev/null +++ b/app/src/androidTest/java/com/example/bem/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.bem; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.bem", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..98c733b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..2adebc2a76ef65e411211ba520a84a7e34093cea GIT binary patch literal 156536 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

igbDZ? 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 android.os.Build.VERSION_CODES.O) { + context.startForegroundService(serviceIntent); + } else { + context.startService(serviceIntent); + } + + createNotificationChannel(context); + showNotification(context, title, message, ringtoneUriString, alarmId); + } + + private void createNotificationChannel(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = "Alarmes de Medicação"; + String description = "Notificações para lembretes de medicamentos"; + int importance = NotificationManager.IMPORTANCE_HIGH; + NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); + channel.setDescription(description); + channel.enableVibration(true); + channel.enableLights(true); + + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + if (notificationManager != null) { + notificationManager.createNotificationChannel(channel); + } + } + } + + private void showNotification(Context context, String title, String message, String ringtoneUriString, int alarmId) { + Intent activityIntent = new Intent(context, AlarmRingingActivity.class); + activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + activityIntent.putExtra("alarm_title", title); + activityIntent.putExtra("alarm_time", new java.text.SimpleDateFormat("HH:mm", java.util.Locale.getDefault()).format(new java.util.Date())); + activityIntent.putExtra("ringtone_uri", ringtoneUriString); + activityIntent.putExtra("alarm_id", alarmId); + + PendingIntent pendingIntent = PendingIntent.getActivity( + context, + alarmId >= 0 ? alarmId : 0, + activityIntent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT + ); + + Intent stopIntent = new Intent(context, AlarmSoundService.class); + stopIntent.setAction("STOP_ALARM"); + PendingIntent stopPendingIntent = PendingIntent.getService( + context, + alarmId >= 0 ? alarmId + 1000 : 1000, + stopIntent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT + ); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) + .setContentTitle("⏰ " + title) + .setContentText(message) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setCategory(NotificationCompat.CATEGORY_ALARM) + .setFullScreenIntent(pendingIntent, true) + .setOngoing(true) + .setAutoCancel(false) + .setContentIntent(pendingIntent) + .addAction(android.R.drawable.ic_media_pause, "Parar", stopPendingIntent); + + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + if (notificationManager != null) { + notificationManager.notify(NOTIFICATION_ID, builder.build()); + } + } + +} + diff --git a/app/src/main/java/com/example/bem/AlarmRingingActivity.java b/app/src/main/java/com/example/bem/AlarmRingingActivity.java new file mode 100644 index 0000000..cce553e --- /dev/null +++ b/app/src/main/java/com/example/bem/AlarmRingingActivity.java @@ -0,0 +1,121 @@ +package com.example.bem; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import java.util.Calendar; + +public class AlarmRingingActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true); + setTurnScreenOn(true); + } else { + getWindow().addFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + ); + } + + setContentView(R.layout.activity_alarm_ringing); + + String title = getIntent().getStringExtra("alarm_title"); + String time = getIntent().getStringExtra("alarm_time"); + String ringtoneUri = getIntent().getStringExtra("ringtone_uri"); + int alarmId = getIntent().getIntExtra("alarm_id", -1); + + TextView textTitle = findViewById(R.id.textAlarmTitle); + TextView textTime = findViewById(R.id.textAlarmTime); + Button btnSnooze = findViewById(R.id.btnSnooze); + Button btnStop = findViewById(R.id.btnStop); + + if (title != null) { + textTitle.setText(title); + } + if (time != null) { + textTime.setText(time); + } + + btnSnooze.setOnClickListener(v -> { + snoozeAlarm(title, ringtoneUri, alarmId); + stopAlarmService(); + finish(); + }); + + btnStop.setOnClickListener(v -> { + stopAlarmService(); + finish(); + }); + } + + private void snoozeAlarm(String title, String ringtoneUri, int alarmId) { + AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + if (alarmManager == null) return; + + Intent intent = new Intent(this, AlarmReceiver.class); + intent.putExtra("alarm_title", title); + intent.putExtra("alarm_message", "Hora de tomar: " + title); + intent.putExtra("ringtone_uri", ringtoneUri); + + int snoozeId = alarmId >= 0 ? alarmId + 10000 : (int) System.currentTimeMillis(); + + PendingIntent pendingIntent = PendingIntent.getBroadcast( + this, + snoozeId, + intent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT + ); + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MINUTE, 5); + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), + pendingIntent + ); + } else { + alarmManager.setExact( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), + pendingIntent + ); + } + + android.widget.Toast.makeText(this, "⏰ Alarme adiado por 5 minutos", android.widget.Toast.LENGTH_LONG).show(); + } catch (SecurityException e) { + android.widget.Toast.makeText(this, "Erro ao adiar alarme", android.widget.Toast.LENGTH_SHORT).show(); + } + } + + private void stopAlarmService() { + Intent serviceIntent = new Intent(this, AlarmSoundService.class); + stopService(serviceIntent); + } + + @Override + public void onBackPressed() { + // Não permite voltar sem parar o alarme + } +} + + + + diff --git a/app/src/main/java/com/example/bem/AlarmSoundService.java b/app/src/main/java/com/example/bem/AlarmSoundService.java new file mode 100644 index 0000000..b361c8f --- /dev/null +++ b/app/src/main/java/com/example/bem/AlarmSoundService.java @@ -0,0 +1,201 @@ +package com.example.bem; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.os.IBinder; +import android.os.VibrationEffect; +import android.os.Vibrator; + +import androidx.core.app.NotificationCompat; + +public class AlarmSoundService extends Service { + + private static final String CHANNEL_ID = "alarm_sound_channel"; + private static final int NOTIFICATION_ID = 2001; + private MediaPlayer mediaPlayer; + private Vibrator vibrator; + + @Override + public void onCreate() { + super.onCreate(); + createNotificationChannel(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null && "STOP_ALARM".equals(intent.getAction())) { + stopSelf(); + return START_NOT_STICKY; + } + + String title = intent.getStringExtra("alarm_title"); + String ringtoneUriString = intent.getStringExtra("ringtone_uri"); + + startForeground(NOTIFICATION_ID, createNotification(title)); + + playAlarmSound(ringtoneUriString); + vibratePhone(); + + new android.os.Handler().postDelayed(this::stopSelf, 60000); + + return START_NOT_STICKY; + } + + private void playAlarmSound(String ringtoneUriString) { + try { + Uri soundUri; + if (ringtoneUriString != null && !ringtoneUriString.isEmpty()) { + soundUri = Uri.parse(ringtoneUriString); + } else { + soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + if (soundUri == null) { + soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + } + } + + mediaPlayer = new MediaPlayer(); + mediaPlayer.setDataSource(this, soundUri); + + AudioAttributes audioAttributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); + mediaPlayer.setAudioAttributes(audioAttributes); + + AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + if (audioManager != null) { + int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM); + audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0); + } + + mediaPlayer.setLooping(true); + mediaPlayer.setVolume(1.0f, 1.0f); + + mediaPlayer.setOnPreparedListener(mp -> { + mp.start(); + }); + + mediaPlayer.setOnErrorListener((mp, what, extra) -> { + mp.reset(); + return true; + }); + + mediaPlayer.prepareAsync(); + + } catch (Exception e) { + e.printStackTrace(); + try { + Uri defaultUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + if (defaultUri != null && mediaPlayer != null) { + mediaPlayer.reset(); + mediaPlayer.setDataSource(this, defaultUri); + mediaPlayer.prepare(); + mediaPlayer.start(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + private void vibratePhone() { + vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null && vibrator.hasVibrator()) { + long[] pattern = { + 0, // Início + 400, // Vibra 400ms + 1200, // Pausa 1.2s + 400, // Vibra 400ms + 3000 // Pausa 3s antes de repetir + }; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + vibrator.vibrate(VibrationEffect.createWaveform(pattern, 0)); + } else { + vibrator.vibrate(pattern, 0); + } + } + } + + private Notification createNotification(String title) { + Intent stopIntent = new Intent(this, AlarmSoundService.class); + stopIntent.setAction("STOP_ALARM"); + PendingIntent stopPendingIntent = PendingIntent.getService( + this, + 0, + stopIntent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT + ); + + Intent openIntent = new Intent(this, MainActivity.class); + openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + PendingIntent openPendingIntent = PendingIntent.getActivity( + this, + 0, + openIntent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT + ); + + return new NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) + .setContentTitle("⏰ " + (title != null ? title : "Alarme de Medicamento")) + .setContentText("Hora de tomar o medicamento! Toque para abrir.") + .setPriority(NotificationCompat.PRIORITY_MAX) + .setCategory(NotificationCompat.CATEGORY_ALARM) + .setOngoing(true) + .setAutoCancel(false) + .setContentIntent(openPendingIntent) + .addAction(android.R.drawable.ic_media_pause, "Parar", stopPendingIntent) + .build(); + } + + private void createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID, + "Serviço de Alarme", + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Toca o alarme de medicação"); + channel.setSound(null, null); + + NotificationManager manager = getSystemService(NotificationManager.class); + if (manager != null) { + manager.createNotificationChannel(channel); + } + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + if (mediaPlayer != null) { + if (mediaPlayer.isPlaying()) { + mediaPlayer.stop(); + } + mediaPlayer.release(); + mediaPlayer = null; + } + + if (vibrator != null) { + vibrator.cancel(); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } +} + diff --git a/app/src/main/java/com/example/bem/InviteCodeActivity.java b/app/src/main/java/com/example/bem/InviteCodeActivity.java new file mode 100644 index 0000000..9586f48 --- /dev/null +++ b/app/src/main/java/com/example/bem/InviteCodeActivity.java @@ -0,0 +1,248 @@ +package com.example.bem; + +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.firestore.FieldValue; +import com.google.firebase.firestore.FirebaseFirestore; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +public class InviteCodeActivity extends AppCompatActivity { + + private FirebaseAuth mAuth; + private FirebaseFirestore db; + + private LinearLayout layoutGenerateCode; + private LinearLayout layoutEnterCode; + private TextView textInviteCode; + private TextView textCountdown; + private TextView textModeDescription; + private Button btnGenerateCode; + private EditText inputInviteCode; + private Button btnValidateCode; + private Button btnBack; + + private String currentCode = null; + private CountDownTimer countDownTimer; + private boolean isGuardianMode = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_invite_code); + + mAuth = FirebaseAuth.getInstance(); + db = FirebaseFirestore.getInstance(); + + layoutGenerateCode = findViewById(R.id.layoutGenerateCode); + layoutEnterCode = findViewById(R.id.layoutEnterCode); + textInviteCode = findViewById(R.id.textInviteCode); + textCountdown = findViewById(R.id.textCountdown); + textModeDescription = findViewById(R.id.textModeDescription); + btnGenerateCode = findViewById(R.id.btnGenerateCode); + inputInviteCode = findViewById(R.id.inputInviteCode); + btnValidateCode = findViewById(R.id.btnValidateCode); + btnBack = findViewById(R.id.btnBack); + + isGuardianMode = getIntent().getBooleanExtra("is_guardian", false); + + if (isGuardianMode) { + textModeDescription.setText("Insira o código do utilizador para se vincular como responsável"); + layoutGenerateCode.setVisibility(View.GONE); + layoutEnterCode.setVisibility(View.VISIBLE); + } else { + textModeDescription.setText("Gere um código temporário para vincular responsável"); + layoutGenerateCode.setVisibility(View.VISIBLE); + layoutEnterCode.setVisibility(View.GONE); + generateCode(); + } + + btnGenerateCode.setOnClickListener(v -> generateCode()); + btnValidateCode.setOnClickListener(v -> validateCode()); + btnBack.setOnClickListener(v -> finish()); + } + + private void generateCode() { + if (mAuth.getCurrentUser() == null) { + Toast.makeText(this, "Erro: Não autenticado", Toast.LENGTH_SHORT).show(); + return; + } + + String code = String.format("%06d", new Random().nextInt(999999)); + currentCode = code; + textInviteCode.setText(code); + + String userId = mAuth.getCurrentUser().getUid(); + Map codeData = new HashMap<>(); + codeData.put("code", code); + codeData.put("userId", userId); + codeData.put("createdAt", System.currentTimeMillis()); + codeData.put("expiresAt", System.currentTimeMillis() + 30000); + codeData.put("used", false); + + db.collection("inviteCodes").document(code) + .set(codeData) + .addOnSuccessListener(aVoid -> { + startCountdown(); + Toast.makeText(this, "✓ Código gerado! Válido por 30 segundos", Toast.LENGTH_SHORT).show(); + }) + .addOnFailureListener(e -> { + Toast.makeText(this, "Erro ao gerar código: " + e.getMessage(), Toast.LENGTH_LONG).show(); + }); + } + + private void startCountdown() { + if (countDownTimer != null) { + countDownTimer.cancel(); + } + + countDownTimer = new CountDownTimer(30000, 1000) { + @Override + public void onTick(long millisUntilFinished) { + int seconds = (int) (millisUntilFinished / 1000); + textCountdown.setText("Expira em: " + seconds + "s"); + + if (seconds <= 10) { + textCountdown.setTextColor(getResources().getColor(android.R.color.holo_red_dark)); + } + } + + @Override + public void onFinish() { + textCountdown.setText("Código expirado"); + textInviteCode.setText("------"); + currentCode = null; + + btnGenerateCode.setEnabled(true); + } + }; + + countDownTimer.start(); + btnGenerateCode.setEnabled(false); + } + + private void validateCode() { + String code = inputInviteCode.getText().toString().trim(); + + if (TextUtils.isEmpty(code) || code.length() != 6) { + inputInviteCode.setError("Código deve ter 6 dígitos"); + return; + } + + if (mAuth.getCurrentUser() == null) { + Toast.makeText(this, "Erro: Não autenticado", Toast.LENGTH_SHORT).show(); + return; + } + + btnValidateCode.setEnabled(false); + + db.collection("inviteCodes").document(code) + .get() + .addOnSuccessListener(document -> { + if (!document.exists()) { + btnValidateCode.setEnabled(true); + Toast.makeText(this, "❌ Código inválido", Toast.LENGTH_SHORT).show(); + return; + } + + Boolean used = document.getBoolean("used"); + Long expiresAt = document.getLong("expiresAt"); + String targetUserId = document.getString("userId"); + + if (used != null && used) { + btnValidateCode.setEnabled(true); + Toast.makeText(this, "❌ Código já utilizado", Toast.LENGTH_SHORT).show(); + return; + } + + if (expiresAt != null && System.currentTimeMillis() > expiresAt) { + btnValidateCode.setEnabled(true); + Toast.makeText(this, "❌ Código expirado", Toast.LENGTH_SHORT).show(); + return; + } + + linkGuardianToUser(code, targetUserId); + }) + .addOnFailureListener(e -> { + btnValidateCode.setEnabled(true); + Toast.makeText(this, "Erro: " + e.getMessage(), Toast.LENGTH_LONG).show(); + }); + } + + private void linkGuardianToUser(String code, String targetUserId) { + String guardianId = mAuth.getCurrentUser().getUid(); + + Map linkData = new HashMap<>(); + linkData.put("guardianId", guardianId); + linkData.put("linkedAt", System.currentTimeMillis()); + + // 1. Update the Target User's document (Add guardian to their list) + db.collection("users").document(targetUserId) + .update("guardians", FieldValue.arrayUnion(guardianId)) + .addOnSuccessListener(aVoid -> { + + // 2. Update the Guardian's document (Add target user to their list) + db.collection("users").document(guardianId) + .update("managedUsers", FieldValue.arrayUnion(targetUserId)) + .addOnSuccessListener(aVoid2 -> { + + // 3. Mark code as used + db.collection("inviteCodes").document(code) + .update("used", true) + .addOnSuccessListener(aVoid3 -> { + Toast.makeText(this, "✓ Vinculado com sucesso!", Toast.LENGTH_LONG).show(); + + Intent intent = new Intent(this, MainActivity.class); + intent.setFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + }) + .addOnFailureListener(e -> { + // Even if marking code fails, the link is done. + // But ideally we should handle this. For now, proceeding. + Intent intent = new Intent(this, MainActivity.class); + intent.setFlags( + Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + }); + + }) + .addOnFailureListener(e -> { + // If updating guardian fails, we should probably revert or warn. + // For MVP/Simple app: Log and warn. + btnValidateCode.setEnabled(true); + Toast.makeText(this, "Erro ao atualizar perfil do responsável: " + e.getMessage(), + Toast.LENGTH_LONG).show(); + }); + + }) + .addOnFailureListener(e -> { + btnValidateCode.setEnabled(true); + Toast.makeText(this, "Erro ao vincular: " + e.getMessage(), Toast.LENGTH_LONG).show(); + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (countDownTimer != null) { + countDownTimer.cancel(); + } + } +} diff --git a/app/src/main/java/com/example/bem/LoginActivity.java b/app/src/main/java/com/example/bem/LoginActivity.java new file mode 100644 index 0000000..ffa7c67 --- /dev/null +++ b/app/src/main/java/com/example/bem/LoginActivity.java @@ -0,0 +1,340 @@ +package com.example.bem; + +import android.app.AlertDialog; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.firestore.FirebaseFirestore; + +import java.util.HashMap; +import java.util.Map; + +public class LoginActivity extends AppCompatActivity { + + private FirebaseAuth mAuth; + private FirebaseFirestore db; + private SharedPreferences prefs; + private static final String PREF_DARK_MODE = "dark_mode"; + + private EditText inputEmail; + private EditText inputPassword; + private EditText inputName; + private EditText inputPhone; + private Button btnLogin; + private TextView textLoginType; + private TextView textSwitchMode; + private TextView textForgotPassword; + private TextView textSwitchToGuardian; + private ProgressBar progressBar; + + private boolean isRegisterMode = false; + private boolean isGuardianMode = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + prefs = getSharedPreferences("app_prefs", MODE_PRIVATE); + applyThemeFromPrefs(); + + mAuth = FirebaseAuth.getInstance(); + db = FirebaseFirestore.getInstance(); + + // Forçar login sempre que abrir a app: faz signOut se já existir sessão + if (mAuth.getCurrentUser() != null) { + mAuth.signOut(); + } + + setContentView(R.layout.activity_login); + + inputEmail = findViewById(R.id.inputEmail); + inputPassword = findViewById(R.id.inputPassword); + inputName = findViewById(R.id.inputName); + inputPhone = findViewById(R.id.inputPhone); + btnLogin = findViewById(R.id.btnLogin); + textLoginType = findViewById(R.id.textLoginType); + textSwitchMode = findViewById(R.id.textSwitchMode); + textForgotPassword = findViewById(R.id.textForgotPassword); + textSwitchToGuardian = findViewById(R.id.textSwitchToGuardian); + + btnLogin.setOnClickListener(v -> handleLogin()); + textSwitchMode.setOnClickListener(v -> toggleMode()); + textForgotPassword.setOnClickListener(v -> showForgotPasswordDialog()); + textSwitchToGuardian.setOnClickListener(v -> switchToGuardianMode()); + } + + private void switchToGuardianMode() { + isGuardianMode = !isGuardianMode; + + if (isGuardianMode) { + textLoginType.setText("Login de Responsável"); + textSwitchToGuardian.setText("👤 Sou Utilizador"); + inputPhone.setVisibility(View.VISIBLE); + inputPhone.setHint("Número de telemóvel"); + } else { + textLoginType.setText("Login de Utilizador"); + textSwitchToGuardian.setText("🔒 Sou Responsável"); + inputPhone.setVisibility(View.GONE); + } + + isRegisterMode = false; + updateUI(); + } + + private void toggleMode() { + isRegisterMode = !isRegisterMode; + updateUI(); + } + + private void updateUI() { + if (isRegisterMode) { + btnLogin.setText("Criar Conta"); + textSwitchMode.setText("Já tem conta? Entrar"); + inputName.setVisibility(View.VISIBLE); + + if (isGuardianMode) { + inputPhone.setVisibility(View.VISIBLE); + } + } else { + btnLogin.setText("Entrar"); + textSwitchMode.setText("Não tem conta? Registar"); + inputName.setVisibility(View.GONE); + + if (!isGuardianMode) { + inputPhone.setVisibility(View.GONE); + } + } + } + + private void handleLogin() { + String email = inputEmail.getText().toString().trim(); + String password = inputPassword.getText().toString().trim(); + String name = inputName.getText().toString().trim(); + String phone = inputPhone.getText().toString().trim(); + + if (TextUtils.isEmpty(email)) { + inputEmail.setError("Insira o email"); + return; + } + + if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + inputEmail.setError("Email inválido"); + return; + } + + if (TextUtils.isEmpty(password)) { + inputPassword.setError("Insira a palavra-passe"); + return; + } + + if (password.length() < 6) { + inputPassword.setError("Mínimo 6 caracteres"); + return; + } + + if (isRegisterMode && TextUtils.isEmpty(name)) { + inputName.setError("Insira o nome"); + return; + } + + btnLogin.setEnabled(false); + + if (isRegisterMode) { + registerUser(email, password, name, phone); + } else { + loginUser(email, password); + } + } + + private void registerUser(String email, String password, String name, String phone) { + mAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(task -> { + if (task.isSuccessful()) { + FirebaseUser user = mAuth.getCurrentUser(); + if (user != null) { + saveUserData(user.getUid(), email, name, phone, true); + } else { + btnLogin.setEnabled(true); + Toast.makeText(this, "Erro ao obter utilizador. Tente entrar com o email/senha.", + Toast.LENGTH_LONG).show(); + mAuth.signOut(); + } + } else { + btnLogin.setEnabled(true); + String error = task.getException() != null ? task.getException().getMessage() + : "Erro desconhecido"; + Toast.makeText(this, "Erro: " + error, Toast.LENGTH_LONG).show(); + } + }); + } + + private void saveUserData(String uid, String email, String name, String phone, boolean fromRegister) { + Map userData = new HashMap<>(); + userData.put("email", email); + userData.put("name", name); + userData.put("phone", phone != null ? phone : ""); + userData.put("type", isGuardianMode ? "guardian" : "user"); + userData.put("createdAt", System.currentTimeMillis()); + + db.collection("users").document(uid) + .set(userData) + .addOnSuccessListener(aVoid -> { + if (fromRegister) { + Toast.makeText(this, "✓ Conta criada! Faça login para continuar.", Toast.LENGTH_LONG).show(); + mAuth.signOut(); + btnLogin.setEnabled(true); + // Recarrega a tela limpa + Intent intent = getIntent(); + finish(); + startActivity(intent); + } else { + redirectToApp(); + } + }) + .addOnFailureListener(e -> { + btnLogin.setEnabled(true); + Toast.makeText(this, "Erro ao salvar dados: " + e.getMessage(), Toast.LENGTH_LONG).show(); + }); + } + + private void loginUser(String email, String password) { + mAuth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(task -> { + if (task.isSuccessful()) { + FirebaseUser user = mAuth.getCurrentUser(); + if (user != null) { + checkUserTypeAndRedirect(user.getUid()); + } else { + btnLogin.setEnabled(true); + Toast.makeText(this, "Erro ao iniciar sessão. Tente novamente.", Toast.LENGTH_LONG).show(); + } + } else { + btnLogin.setEnabled(true); + String error = task.getException() != null ? task.getException().getMessage() + : "Credenciais inválidas"; + Toast.makeText(this, "Erro: " + error, Toast.LENGTH_LONG).show(); + } + }); + } + + private void checkUserTypeAndRedirect(String uid) { + db.collection("users").document(uid) + .get() + .addOnSuccessListener(document -> { + if (document.exists()) { + String type = document.getString("type"); + prefs.edit() + .putString("user_type", type != null ? type : "user") + .putString("user_name", document.getString("name")) + .apply(); + + if ("guardian".equals(type)) { + // Verifies if guardian is already linked to a user + java.util.List managedUsers = (java.util.List) document.get("managedUsers"); + + if (managedUsers != null && !managedUsers.isEmpty()) { + redirectToApp(); + } else { + // If not linked, redirect to enter access code + Intent intent = new Intent(LoginActivity.this, InviteCodeActivity.class); + intent.putExtra("is_guardian", true); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + } + } else { + redirectToApp(); + } + } else { + // Se o documento não existir (ex.: registo antigo sem salvar), cria um básico + FirebaseUser user = mAuth.getCurrentUser(); + String email = user != null ? user.getEmail() : ""; + String name = (email != null && email.contains("@")) ? email.substring(0, email.indexOf("@")) + : "Utilizador"; + + Map userData = new HashMap<>(); + userData.put("email", email); + userData.put("name", name); + userData.put("phone", ""); + userData.put("type", "user"); + userData.put("createdAt", System.currentTimeMillis()); + + db.collection("users").document(uid) + .set(userData) + .addOnSuccessListener(aVoid -> { + prefs.edit() + .putString("user_type", "user") + .putString("user_name", name) + .apply(); + redirectToApp(); + }) + .addOnFailureListener(e -> { + Toast.makeText(this, "Erro ao criar perfil: " + e.getMessage(), Toast.LENGTH_SHORT) + .show(); + btnLogin.setEnabled(true); + }); + } + }) + .addOnFailureListener(e -> { + Toast.makeText(this, "Erro ao carregar dados", Toast.LENGTH_SHORT).show(); + btnLogin.setEnabled(true); + }); + } + + private void redirectToApp() { + Intent intent = new Intent(this, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + } + + private void showForgotPasswordDialog() { + View dialogView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null); + EditText emailInput = new EditText(this); + emailInput.setHint("Email de recuperação"); + emailInput.setInputType(android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); + emailInput.setPadding(50, 40, 50, 40); + + new AlertDialog.Builder(this) + .setTitle("Recuperar Palavra-passe") + .setMessage("Insira o email para receber o link de recuperação:") + .setView(emailInput) + .setPositiveButton("Enviar", (dialog, which) -> { + String email = emailInput.getText().toString().trim(); + if (TextUtils.isEmpty(email)) { + Toast.makeText(this, "Insira um email", Toast.LENGTH_SHORT).show(); + return; + } + + mAuth.sendPasswordResetEmail(email) + .addOnSuccessListener(aVoid -> { + Toast.makeText(this, "✓ Email enviado! Verifique a caixa de entrada.", + Toast.LENGTH_LONG).show(); + }) + .addOnFailureListener(e -> { + Toast.makeText(this, "Erro: " + e.getMessage(), Toast.LENGTH_LONG).show(); + }); + }) + .setNegativeButton("Cancelar", null) + .show(); + } + + private void applyThemeFromPrefs() { + boolean dark = getSharedPreferences("app_prefs", MODE_PRIVATE).getBoolean(PREF_DARK_MODE, false); + AppCompatDelegate + .setDefaultNightMode(dark ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); + } +} diff --git a/app/src/main/java/com/example/bem/MainActivity.java b/app/src/main/java/com/example/bem/MainActivity.java new file mode 100644 index 0000000..7334e4b --- /dev/null +++ b/app/src/main/java/com/example/bem/MainActivity.java @@ -0,0 +1,932 @@ +package com.example.bem; + +import android.Manifest; +import android.app.AlarmManager; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.firestore.FirebaseFirestore; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class MainActivity extends AppCompatActivity { + + private enum Tab { + ALARMS, + REMINDERS, + GUARDIANS, + CALENDAR + } + + private FrameLayout tabContainer; + private LinearLayout tabAlarms; + private LinearLayout tabReminders; + private LinearLayout tabGuardians; + private LinearLayout tabCalendar; + private ImageView iconAlarms; + private ImageView iconReminders; + private ImageView iconGuardians; + private ImageView iconCalendar; + private TextView textAlarms; + private TextView textReminders; + private TextView textGuardians; + private TextView textCalendar; + + private LayoutInflater inflater; + private View alarmsView; + private View remindersView; + private View guardiansView; + private View calendarView; + private LinearLayout alarmListContainer; + private final List alarms = new ArrayList<>(); + private Tab currentTab = null; + private FirebaseAuth mAuth; + private FirebaseFirestore db; + private SharedPreferences prefs; + private static final String PREF_GUARDIAN_PIN = "guardian_pin"; + private static final String PREF_DARK_MODE = "dark_mode"; + private static final int REQUEST_NOTIFICATION_PERMISSION = 1001; + private static final int REQUEST_RINGTONE_PICKER = 1002; + private int editingAlarmIndex = -1; + private String currentUserId = null; + private boolean isGuardian = false; + + private final ActivityResultLauncher notificationPermissionLauncher = registerForActivityResult( + new ActivityResultContracts.RequestPermission(), isGranted -> { + if (isGranted) { + Toast.makeText(this, "Permissão de notificações concedida!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "Permissão negada. Alarmes podem não tocar.", Toast.LENGTH_LONG).show(); + } + }); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mAuth = FirebaseAuth.getInstance(); + db = FirebaseFirestore.getInstance(); + + FirebaseUser currentUser = mAuth.getCurrentUser(); + if (currentUser == null) { + redirectToLogin(); + return; + } + + prefs = getSharedPreferences("app_prefs", MODE_PRIVATE); + applyThemeFromPrefs(); + + EdgeToEdge.enable(this); + setContentView(R.layout.activity_main); + inflater = LayoutInflater.from(this); + + currentUserId = currentUser.getUid(); + String userType = prefs.getString("user_type", "user"); + isGuardian = "guardian".equals(userType); + + tabContainer = findViewById(R.id.tabContainer); + tabAlarms = findViewById(R.id.tabAlarms); + tabReminders = findViewById(R.id.tabReminders); + tabGuardians = findViewById(R.id.tabGuardians); + tabCalendar = findViewById(R.id.tabCalendar); + + iconAlarms = findViewById(R.id.iconAlarms); + iconReminders = findViewById(R.id.iconReminders); + iconGuardians = findViewById(R.id.iconGuardians); + iconCalendar = findViewById(R.id.iconCalendar); + + textAlarms = findViewById(R.id.textAlarms); + textReminders = findViewById(R.id.textReminders); + textGuardians = findViewById(R.id.textGuardians); + textCalendar = findViewById(R.id.textCalendar); + + ImageView profileButton = findViewById(R.id.profileButton); + + tabAlarms.setOnClickListener(v -> switchTab(Tab.ALARMS)); + tabReminders.setOnClickListener(v -> switchTab(Tab.REMINDERS)); + tabGuardians.setOnClickListener(v -> handleGuardianTabClick()); + tabCalendar.setOnClickListener(v -> switchTab(Tab.CALENDAR)); + profileButton.setOnClickListener(v -> showProfileMenu()); + + requestNotificationPermissions(); + seedSampleAlarms(); + + applyUserModeLayout(); + } + + private void applyUserModeLayout() { + if (isGuardian) { + tabAlarms.setVisibility(View.GONE); + tabReminders.setVisibility(View.GONE); + tabCalendar.setVisibility(View.VISIBLE); + + // Guardian starts on their panel + switchTab(Tab.GUARDIANS); + } else { + tabAlarms.setVisibility(View.VISIBLE); + tabReminders.setVisibility(View.VISIBLE); + tabCalendar.setVisibility(View.GONE); + + // Regular user starts on Alarms + switchTab(Tab.ALARMS); + } + } + + private void redirectToLogin() { + Intent intent = new Intent(this, LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + } + + // ... existing requestNotificationPermissions ... + + private void handleGuardianTabClick() { + // Guardians are always allowed + if (isGuardian) { + switchTab(Tab.GUARDIANS); + } else { + checkIfUserHasGuardians(); + } + } + + // ... existing checkIfUserHasGuardians, showAddGuardianDialog, + // showGuardianOptionsDialog, settings ... + + // ... showSettingsMenu ... + + // ... toggleDarkMode, showUserInfo, logout, showProfileMenu, + // applyThemeFromPrefs, openSupportEmail ... + + private void switchTab(Tab tab) { + if (tab == currentTab) { + return; + } + currentTab = tab; + + View oldContent = tabContainer.getChildCount() > 0 ? tabContainer.getChildAt(0) : null; + if (oldContent != null) { + oldContent.animate() + .alpha(0f) + .setDuration(150) + .withEndAction(() -> { + tabContainer.removeAllViews(); + loadAndShowTab(tab); + }) + .start(); + } else { + loadAndShowTab(tab); + } + } + + private void loadAndShowTab(Tab tab) { + View content; + switch (tab) { + case REMINDERS: + if (remindersView == null) { + remindersView = inflater.inflate(R.layout.layout_tab_reminders, tabContainer, false); + } + content = remindersView; + break; + case GUARDIANS: + if (guardiansView == null) { + guardiansView = inflater.inflate(R.layout.layout_tab_guardians, tabContainer, false); + } + loadGuardianData(guardiansView); + content = guardiansView; + break; + case CALENDAR: + if (calendarView == null) { + calendarView = inflater.inflate(R.layout.layout_tab_calendar, tabContainer, false); + } + setupCalendar(calendarView); + content = calendarView; + break; + case ALARMS: + default: + if (alarmsView == null) { + alarmsView = inflater.inflate(R.layout.layout_tab_alarms, tabContainer, false); + } + // ... setup alarmsView listeners ... + Button addAlarm = alarmsView.findViewById(R.id.btnAddAlarm); + ImageView btnSettings = alarmsView.findViewById(R.id.btnSettings); + alarmListContainer = alarmsView.findViewById(R.id.alarmListContainer); + if (addAlarm != null) { + addAlarm.setOnClickListener(v -> showAddAlarmDialog()); + } + if (btnSettings != null) { + btnSettings.setOnClickListener(v -> showSettingsMenu()); + } + renderAlarms(); + content = alarmsView; + break; + } + + content.setAlpha(0f); + tabContainer.addView(content); + content.animate() + .alpha(1f) + .setDuration(120) + .start(); + + updateTabHighlight(tab); + } + + private void setupCalendar(View view) { + LinearLayout calendarGrid = view.findViewById(R.id.calendarGrid); + TextView monthTitle = view.findViewById(R.id.textMonthTitle); + LinearLayout legendContainer = view.findViewById(R.id.legendContainer); + + calendarGrid.removeAllViews(); + legendContainer.removeAllViews(); + + Calendar calendar = Calendar.getInstance(); + int currentDay = calendar.get(Calendar.DAY_OF_MONTH); + int currentMonth = calendar.get(Calendar.MONTH); + + String[] months = { "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", + "Outubro", "Novembro", "Dezembro" }; + monthTitle.setText(months[currentMonth] + " " + calendar.get(Calendar.YEAR)); + + // Colors for dots + int[] dotColors = { + ContextCompat.getColor(this, R.color.primary), + ContextCompat.getColor(this, R.color.guardian_purple_end), + ContextCompat.getColor(this, R.color.delete), + 0xFFFFA500, // Orange + 0xFF00C853 // Green + }; + + // Map medications to colors + java.util.Map medColors = new java.util.HashMap<>(); + int colorIndex = 0; + for (AlarmItem alarm : alarms) { + medColors.put(alarm.title, dotColors[colorIndex % dotColors.length]); + colorIndex++; + + // Add to legend + View legendItem = new TextView(this); + ((TextView) legendItem).setText("• " + alarm.title); + ((TextView) legendItem).setTextColor(medColors.get(alarm.title)); + ((TextView) legendItem).setTextSize(14); + ((TextView) legendItem).setPadding(0, 0, 0, 8); + legendContainer.addView(legendItem); + } + + calendar.set(Calendar.DAY_OF_MONTH, 1); + int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 0=Sunday + int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + + SharedPreferences logPrefs = getSharedPreferences("medication_log", MODE_PRIVATE); + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd", java.util.Locale.getDefault()); + + LinearLayout currentWeekRow = null; + + // Empty cells for dias before 1st + currentWeekRow = new LinearLayout(this); + currentWeekRow.setOrientation(LinearLayout.HORIZONTAL); + calendarGrid.addView(currentWeekRow); + + for (int i = 0; i < firstDayOfWeek; i++) { + View empty = new View(this); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, 50, 1.0f); + empty.setLayoutParams(params); + currentWeekRow.addView(empty); + } + + int dayOfWeekCounter = firstDayOfWeek; + + for (int day = 1; day <= daysInMonth; day++) { + if (dayOfWeekCounter == 0) { + currentWeekRow = new LinearLayout(this); + currentWeekRow.setOrientation(LinearLayout.HORIZONTAL); + calendarGrid.addView(currentWeekRow); + } + + View dayCell = inflater.inflate(R.layout.item_calendar_day, currentWeekRow, false); + TextView numText = dayCell.findViewById(R.id.textDayNumber); + LinearLayout dots = dayCell.findViewById(R.id.dotsContainer); + + numText.setText(String.valueOf(day)); + + if (day == currentDay) { + numText.setBackground(ContextCompat.getDrawable(this, R.drawable.bg_calendar_day_selected)); + numText.setTextColor(ContextCompat.getColor(this, R.color.primary)); + } else { + numText.setBackground(null); + } + + // Verify taken meds for this day + calendar.set(Calendar.DAY_OF_MONTH, day); + String dateKey = sdf.format(calendar.getTime()); + + for (AlarmItem alarm : alarms) { + String key = "med_" + alarm.title.replaceAll("\\s+", "_") + "_" + dateKey; + if (logPrefs.getBoolean(key + "_taken", false)) { + // Add dot + View dot = new View(this); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(12, 12); + params.setMargins(2, 0, 2, 0); + dot.setLayoutParams(params); + dot.setBackground(ContextCompat.getDrawable(this, R.drawable.bg_dot)); + dot.getBackground().setTint(medColors.get(alarm.title)); + dots.addView(dot); + } + } + + currentWeekRow.addView(dayCell); + + dayOfWeekCounter++; + if (dayOfWeekCounter >= 7) { + dayOfWeekCounter = 0; + } + } + + // Fill remaining cells + if (dayOfWeekCounter != 0) { + while (dayOfWeekCounter < 7) { + View empty = new View(this); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, 50, 1.0f); + empty.setLayoutParams(params); + currentWeekRow.addView(empty); + dayOfWeekCounter++; + } + } + } + + private void updateTabHighlight(Tab tab) { + resetTab(tabAlarms, iconAlarms, textAlarms); + resetTab(tabReminders, iconReminders, textReminders); + resetTab(tabGuardians, iconGuardians, textGuardians); + resetTab(tabCalendar, iconCalendar, textCalendar); + + switch (tab) { + case ALARMS: + highlightTab(tabAlarms, iconAlarms, textAlarms); + break; + case REMINDERS: + highlightTab(tabReminders, iconReminders, textReminders); + break; + case GUARDIANS: + highlightTab(tabGuardians, iconGuardians, textGuardians); + break; + case CALENDAR: + highlightTab(tabCalendar, iconCalendar, textCalendar); + break; + } + } + + private void highlightTab(LinearLayout layout, ImageView icon, TextView text) { + layout.setBackground(ContextCompat.getDrawable(this, R.drawable.bg_tab_active)); + icon.setColorFilter(ContextCompat.getColor(this, R.color.primary)); + text.setTextColor(ContextCompat.getColor(this, R.color.primary)); + } + + private void resetTab(LinearLayout layout, ImageView icon, TextView text) { + layout.setBackground(null); + int neutral = ContextCompat.getColor(this, R.color.neutral_medium); + icon.setColorFilter(neutral); + text.setTextColor(neutral); + } + + private void seedSampleAlarms() { + alarms.add(new AlarmItem("Tomar medicamentos", "08:00 • 100mg", "Seg • Ter • Qua • Qui • Sex", true)); + alarms.add(new AlarmItem("Almoço", "12:30 • 1 comprimido", "Seg • Ter • Qua • Qui • Sex • Sáb • Dom", true)); + } + + private void renderAlarms() { + if (alarmListContainer == null) { + return; + } + alarmListContainer.removeAllViews(); + if (alarms.isEmpty()) { + TextView empty = new TextView(this); + empty.setText("Sem alarmes. Toque em \"+ Novo\" para criar um."); + empty.setTextColor(ContextCompat.getColor(this, R.color.neutral_medium)); + empty.setPadding(0, 24, 0, 24); + alarmListContainer.addView(empty); + return; + } + for (int i = 0; i < alarms.size(); i++) { + final int index = i; + AlarmItem item = alarms.get(i); + View card = inflater.inflate(R.layout.item_alarm_card, alarmListContainer, false); + TextView title = card.findViewById(R.id.textAlarmTitle); + TextView time = card.findViewById(R.id.textAlarmTime); + TextView days = card.findViewById(R.id.textAlarmDays); + Switch toggle = card.findViewById(R.id.switchAlarm); + ImageButton edit = card.findViewById(R.id.buttonEditAlarm); + ImageButton delete = card.findViewById(R.id.buttonDeleteAlarm); + Button confirmBtn = card.findViewById(R.id.btnConfirmMedication); + + title.setText(item.title); + time.setText(item.time); + days.setText(item.days); + toggle.setChecked(item.enabled); + + if (item.takenToday) { + confirmBtn.setText("✓ Tomado"); + confirmBtn.setBackgroundColor(ContextCompat.getColor(this, R.color.neutral_medium)); + confirmBtn.setEnabled(false); + } else { + confirmBtn.setText("✓ Confirmar"); + confirmBtn.setBackground(ContextCompat.getDrawable(this, R.drawable.bg_new_button)); + confirmBtn.setEnabled(true); + } + + confirmBtn.setOnClickListener(v -> { + item.takenToday = true; + item.lastTakenTimestamp = System.currentTimeMillis(); + saveMedicationConfirmation(item); + renderAlarms(); + showConfirmationDialog(item); + }); + + toggle.setOnCheckedChangeListener((buttonView, isChecked) -> { + item.enabled = isChecked; + Toast.makeText(this, + item.title + (isChecked ? " ativado" : " desativado"), + Toast.LENGTH_SHORT).show(); + }); + + edit.setOnClickListener(v -> showEditAlarmDialog(item, index)); + + delete.setOnClickListener(v -> { + new AlertDialog.Builder(this) + .setTitle("Remover Alarme") + .setMessage("Tem certeza que deseja remover \"" + item.title + "\"?") + .setPositiveButton("Remover", (dialog, which) -> { + alarms.remove(index); + renderAlarms(); + Toast.makeText(this, "Alarme removido", Toast.LENGTH_SHORT).show(); + }) + .setNegativeButton("Cancelar", null) + .show(); + }); + + alarmListContainer.addView(card); + } + } + + private void showConfirmationDialog(AlarmItem item) { + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("HH:mm", java.util.Locale.getDefault()); + String timeStr = sdf.format(new java.util.Date(item.lastTakenTimestamp)); + + View dialogView = inflater.inflate(R.layout.dialog_add_alarm, null, false); + + new AlertDialog.Builder(this) + .setTitle("✓ Medicamento Confirmado") + .setMessage("Confirmou que tomou:\n\n" + + "💊 " + item.title + "\n" + + "🕐 Às " + timeStr + "\n\n" + + "O responsável será notificado automaticamente.") + .setPositiveButton("OK", null) + .show(); + + Toast.makeText(this, "Responsável notificado!", Toast.LENGTH_LONG).show(); + } + + private void saveMedicationConfirmation(AlarmItem item) { + SharedPreferences confirmPrefs = getSharedPreferences("medication_log", MODE_PRIVATE); + String key = "med_" + item.title.replaceAll("\\s+", "_") + "_" + + new java.text.SimpleDateFormat("yyyyMMdd", java.util.Locale.getDefault()) + .format(new java.util.Date()); + confirmPrefs.edit() + .putLong(key, item.lastTakenTimestamp) + .putBoolean(key + "_taken", true) + .putString(key + "_title", item.title) + .apply(); + } + + private void loadGuardianData(View guardiansView) { + SharedPreferences confirmPrefs = getSharedPreferences("medication_log", MODE_PRIVATE); + java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyyMMdd", + java.util.Locale.getDefault()); + String today = dateFormat.format(new java.util.Date()); + + int takenCount = 0; + int totalCount = alarms.size(); + + for (AlarmItem alarm : alarms) { + String key = "med_" + alarm.title.replaceAll("\\s+", "_") + "_" + today; + if (confirmPrefs.getBoolean(key + "_taken", false)) { + takenCount++; + } + } + + TextView takenText = guardiansView.findViewById(R.id.textTakenCount); + TextView pendingText = guardiansView.findViewById(R.id.textPendingCount); + TextView adherenceText = guardiansView.findViewById(R.id.textAdherenceRate); + + if (takenText != null) { + takenText.setText(String.valueOf(takenCount)); + } + if (pendingText != null) { + pendingText.setText(String.valueOf(totalCount - takenCount)); + } + if (adherenceText != null) { + int adherence = totalCount > 0 ? (takenCount * 100 / totalCount) : 0; + adherenceText.setText(adherence + "%"); + } + + LinearLayout statusContainer = guardiansView.findViewById(R.id.statusContainer); + if (statusContainer != null) { + statusContainer.removeAllViews(); + + for (AlarmItem alarm : alarms) { + String key = "med_" + alarm.title.replaceAll("\\s+", "_") + "_" + today; + boolean taken = confirmPrefs.getBoolean(key + "_taken", false); + long timestamp = confirmPrefs.getLong(key, 0); + + View statusCard = inflater.inflate(R.layout.item_alarm_card, statusContainer, false); + TextView titleView = statusCard.findViewById(R.id.textAlarmTitle); + TextView timeView = statusCard.findViewById(R.id.textAlarmTime); + TextView daysView = statusCard.findViewById(R.id.textAlarmDays); + Button confirmBtn = statusCard.findViewById(R.id.btnConfirmMedication); + Switch toggleSwitch = statusCard.findViewById(R.id.switchAlarm); + ImageButton deleteBtn = statusCard.findViewById(R.id.buttonDeleteAlarm); + + titleView.setText(alarm.title); + timeView.setText(alarm.time); + + toggleSwitch.setVisibility(View.GONE); + deleteBtn.setVisibility(View.GONE); + confirmBtn.setVisibility(View.GONE); + + if (taken) { + java.text.SimpleDateFormat timeFormat = new java.text.SimpleDateFormat("HH:mm", + java.util.Locale.getDefault()); + String takenTime = timeFormat.format(new java.util.Date(timestamp)); + daysView.setText("✓ Tomado às " + takenTime); + daysView.setTextColor(ContextCompat.getColor(this, R.color.primary)); + daysView.setBackgroundColor(ContextCompat.getColor(this, R.color.accent)); + } else { + daysView.setText("⚠ Pendente"); + daysView.setTextColor(ContextCompat.getColor(this, R.color.delete)); + daysView.setBackgroundColor(ContextCompat.getColor(this, R.color.background_surface)); + } + + statusContainer.addView(statusCard); + } + } + } + + private void showAddAlarmDialog() { + View dialogView = inflater.inflate(R.layout.dialog_add_alarm, null, false); + EditText titleInput = dialogView.findViewById(R.id.inputAlarmTitle); + TextView timeDisplay = dialogView.findViewById(R.id.textSelectedTime); + EditText detailsInput = dialogView.findViewById(R.id.inputAlarmDetails); + + final int[] selectedHour = { 8 }; + final int[] selectedMinute = { 0 }; + + timeDisplay.setText(String.format("%02d:%02d", selectedHour[0], selectedMinute[0])); + timeDisplay.setTextColor(ContextCompat.getColor(this, R.color.neutral_dark)); + + View timePickerLayout = (View) timeDisplay.getParent(); + if (timePickerLayout != null) { + timePickerLayout.setOnClickListener(v -> { + android.app.TimePickerDialog picker = new android.app.TimePickerDialog( + this, + (view, hourOfDay, minute) -> { + selectedHour[0] = hourOfDay; + selectedMinute[0] = minute; + timeDisplay.setText(String.format("%02d:%02d", hourOfDay, minute)); + timeDisplay.setTextColor(ContextCompat.getColor(this, R.color.neutral_dark)); + }, + selectedHour[0], + selectedMinute[0], + true); + picker.setTitle("Escolha o horário"); + picker.show(); + }); + } + + AlertDialog dialog = new AlertDialog.Builder(this) + .setView(dialogView) + .setPositiveButton("Guardar", null) + .setNegativeButton("Cancelar", null) + .create(); + + dialog.setOnShowListener(dialogInterface -> { + Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + positiveButton.setTextColor(ContextCompat.getColor(this, R.color.primary)); + positiveButton.setOnClickListener(v -> { + String title = titleInput.getText().toString().trim(); + String details = detailsInput.getText().toString().trim(); + + if (TextUtils.isEmpty(title)) { + titleInput.setError("Insira o nome do medicamento"); + titleInput.requestFocus(); + return; + } + + if (TextUtils.isEmpty(details)) { + details = "Configurar dias na edição"; + } + + String timeFormatted = String.format("%02d:%02d", selectedHour[0], selectedMinute[0]); + AlarmItem newAlarm = new AlarmItem(title, timeFormatted + " • " + details, + "Seg • Ter • Qua • Qui • Sex", true); + newAlarm.hour = selectedHour[0]; + newAlarm.minute = selectedMinute[0]; + alarms.add(newAlarm); + scheduleAlarm(newAlarm, alarms.size() - 1); + renderAlarms(); + Toast.makeText(this, "Alarme criado e agendado!", Toast.LENGTH_SHORT).show(); + dialog.dismiss(); + }); + + Button negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE); + negativeButton.setTextColor(ContextCompat.getColor(this, R.color.neutral_medium)); + }); + + dialog.show(); + } + + private void showEditAlarmDialog(AlarmItem item, int index) { + editingAlarmIndex = index; + + String[] options = { + "⏰ Alterar horário", + "🔔 Escolher toque", + "🎵 Testar toque atual", + "📝 Editar título" + }; + + new AlertDialog.Builder(this) + .setTitle("Editar: " + item.title) + .setItems(options, (dialog, which) -> { + switch (which) { + case 0: + showChangeTimeDialog(item, index); + break; + case 1: + openRingtonePicker(item); + break; + case 2: + testRingtone(item); + break; + case 3: + showEditTitleDialog(item, index); + break; + } + }) + .setNegativeButton("Fechar", null) + .show(); + } + + private void showChangeTimeDialog(AlarmItem item, int index) { + android.app.TimePickerDialog picker = new android.app.TimePickerDialog( + this, + (view, hourOfDay, minute) -> { + item.hour = hourOfDay; + item.minute = minute; + item.time = String.format("%02d:%02d • %s", hourOfDay, minute, + item.time.contains("•") ? item.time.split("•")[1].trim() : ""); + scheduleAlarm(item, index); + renderAlarms(); + Toast.makeText(this, "Horário atualizado!", Toast.LENGTH_SHORT).show(); + }, + item.hour, + item.minute, + true); + picker.setTitle("Novo horário"); + picker.show(); + } + + private void showEditTitleDialog(AlarmItem item, int index) { + EditText input = new EditText(this); + input.setText(item.title); + input.setHint("Nome do medicamento"); + input.setPadding(50, 40, 50, 40); + + new AlertDialog.Builder(this) + .setTitle("Editar nome") + .setView(input) + .setPositiveButton("Guardar", (dialog, which) -> { + String newTitle = input.getText().toString().trim(); + if (!TextUtils.isEmpty(newTitle)) { + item.title = newTitle; + renderAlarms(); + Toast.makeText(this, "Nome atualizado!", Toast.LENGTH_SHORT).show(); + } + }) + .setNegativeButton("Cancelar", null) + .show(); + } + + private void openRingtonePicker(AlarmItem item) { + Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Escolher toque para " + item.title); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); + + Uri currentUri = null; + if (item.ringtoneUri != null && !item.ringtoneUri.isEmpty()) { + try { + currentUri = Uri.parse(item.ringtoneUri); + } catch (Exception e) { + currentUri = null; + } + } + + if (currentUri == null) { + currentUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + } + + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentUri); + + try { + startActivityForResult(intent, REQUEST_RINGTONE_PICKER); + } catch (Exception e) { + Toast.makeText(this, "Erro ao abrir seletor de toques", Toast.LENGTH_SHORT).show(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == REQUEST_RINGTONE_PICKER && resultCode == RESULT_OK && editingAlarmIndex >= 0) { + if (data == null) { + Toast.makeText(this, "Nenhum toque selecionado", Toast.LENGTH_SHORT).show(); + editingAlarmIndex = -1; + return; + } + + Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); + + if (uri != null && editingAlarmIndex < alarms.size()) { + AlarmItem item = alarms.get(editingAlarmIndex); + item.ringtoneUri = uri.toString(); + + try { + Ringtone ringtone = RingtoneManager.getRingtone(this, uri); + if (ringtone != null) { + item.ringtoneName = ringtone.getTitle(this); + if (item.ringtoneName == null || item.ringtoneName.isEmpty()) { + item.ringtoneName = "Toque personalizado"; + } + } else { + item.ringtoneName = "Toque do sistema"; + } + } catch (Exception e) { + item.ringtoneName = "Toque selecionado"; + } + + scheduleAlarm(item, editingAlarmIndex); + + Toast.makeText(this, "✓ Toque guardado: " + item.ringtoneName + "\nToque em 'Testar' para ouvir", + Toast.LENGTH_LONG).show(); + } else if (uri == null && editingAlarmIndex < alarms.size()) { + AlarmItem item = alarms.get(editingAlarmIndex); + item.ringtoneUri = null; + item.ringtoneName = "Toque padrão do sistema"; + Toast.makeText(this, "Usando toque padrão", Toast.LENGTH_SHORT).show(); + } + editingAlarmIndex = -1; + } + } + + private Ringtone currentlyPlayingRingtone = null; + + private void testRingtone(AlarmItem item) { + if (currentlyPlayingRingtone != null && currentlyPlayingRingtone.isPlaying()) { + currentlyPlayingRingtone.stop(); + currentlyPlayingRingtone = null; + Toast.makeText(this, "Toque parado", Toast.LENGTH_SHORT).show(); + return; + } + + Uri ringtoneUri; + if (item.ringtoneUri != null) { + ringtoneUri = Uri.parse(item.ringtoneUri); + } else { + ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + } + + try { + currentlyPlayingRingtone = RingtoneManager.getRingtone(this, ringtoneUri); + currentlyPlayingRingtone.play(); + + Toast.makeText(this, "🔊 Tocando: " + item.ringtoneName + "\nToque novamente para parar", Toast.LENGTH_LONG) + .show(); + + new android.os.Handler().postDelayed(() -> { + if (currentlyPlayingRingtone != null && currentlyPlayingRingtone.isPlaying()) { + currentlyPlayingRingtone.stop(); + currentlyPlayingRingtone = null; + } + }, 5000); + } catch (Exception e) { + Toast.makeText(this, "Erro ao reproduzir toque", Toast.LENGTH_SHORT).show(); + } + } + + private void scheduleAlarm(AlarmItem item, int alarmId) { + AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + if (alarmManager == null) + return; + + Intent intent = new Intent(this, AlarmReceiver.class); + intent.putExtra("alarm_title", item.title); + intent.putExtra("alarm_message", "Hora de tomar: " + item.title); + intent.putExtra("ringtone_uri", item.ringtoneUri); + intent.putExtra("alarm_id", alarmId); + + PendingIntent pendingIntent = PendingIntent.getBroadcast( + this, + alarmId, + intent, + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, item.hour); + calendar.set(Calendar.MINUTE, item.minute); + calendar.set(Calendar.SECOND, 0); + + if (calendar.getTimeInMillis() < System.currentTimeMillis()) { + calendar.add(Calendar.DAY_OF_MONTH, 1); + } + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), + pendingIntent); + } else { + alarmManager.setExact( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), + pendingIntent); + } + Toast.makeText(this, "Alarme programado para " + item.hour + ":" + String.format("%02d", item.minute), + Toast.LENGTH_SHORT).show(); + } catch (SecurityException e) { + Toast.makeText(this, "Erro: Permissão de alarme necessária", Toast.LENGTH_SHORT).show(); + } + } + + private static class AlarmItem { + String title; + String time; + String days; + boolean enabled; + int hour; + int minute; + boolean takenToday; + long lastTakenTimestamp; + String ringtoneUri; + String ringtoneName; + + AlarmItem(String title, String time, String days, boolean enabled) { + this.title = title; + this.time = time; + this.days = days; + this.enabled = enabled; + this.hour = 8; + this.minute = 0; + this.takenToday = false; + this.lastTakenTimestamp = 0; + this.ringtoneUri = null; + this.ringtoneName = "Toque padrão"; + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_alarm_card.xml b/app/src/main/res/drawable/bg_alarm_card.xml new file mode 100644 index 0000000..14132a4 --- /dev/null +++ b/app/src/main/res/drawable/bg_alarm_card.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/drawable/bg_avatar.xml b/app/src/main/res/drawable/bg_avatar.xml new file mode 100644 index 0000000..13d99d5 --- /dev/null +++ b/app/src/main/res/drawable/bg_avatar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_bottom_bar.xml b/app/src/main/res/drawable/bg_bottom_bar.xml new file mode 100644 index 0000000..4ce056a --- /dev/null +++ b/app/src/main/res/drawable/bg_bottom_bar.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_calendar_day_selected.xml b/app/src/main/res/drawable/bg_calendar_day_selected.xml new file mode 100644 index 0000000..044c63a --- /dev/null +++ b/app/src/main/res/drawable/bg_calendar_day_selected.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_chip.xml b/app/src/main/res/drawable/bg_chip.xml new file mode 100644 index 0000000..976119e --- /dev/null +++ b/app/src/main/res/drawable/bg_chip.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_day_chip.xml b/app/src/main/res/drawable/bg_day_chip.xml new file mode 100644 index 0000000..dd500c4 --- /dev/null +++ b/app/src/main/res/drawable/bg_day_chip.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_dot.xml b/app/src/main/res/drawable/bg_dot.xml new file mode 100644 index 0000000..5b5b2ed --- /dev/null +++ b/app/src/main/res/drawable/bg_dot.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_guardian_card.xml b/app/src/main/res/drawable/bg_guardian_card.xml new file mode 100644 index 0000000..2a2b3bc --- /dev/null +++ b/app/src/main/res/drawable/bg_guardian_card.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_guardian_chip.xml b/app/src/main/res/drawable/bg_guardian_chip.xml new file mode 100644 index 0000000..d6815e0 --- /dev/null +++ b/app/src/main/res/drawable/bg_guardian_chip.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_guardian_hero.xml b/app/src/main/res/drawable/bg_guardian_hero.xml new file mode 100644 index 0000000..e4f3f32 --- /dev/null +++ b/app/src/main/res/drawable/bg_guardian_hero.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_header_gradient.xml b/app/src/main/res/drawable/bg_header_gradient.xml new file mode 100644 index 0000000..1514839 --- /dev/null +++ b/app/src/main/res/drawable/bg_header_gradient.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_hero_card.xml b/app/src/main/res/drawable/bg_hero_card.xml new file mode 100644 index 0000000..b16ba79 --- /dev/null +++ b/app/src/main/res/drawable/bg_hero_card.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_icon_button.xml b/app/src/main/res/drawable/bg_icon_button.xml new file mode 100644 index 0000000..7f34c07 --- /dev/null +++ b/app/src/main/res/drawable/bg_icon_button.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_new_button.xml b/app/src/main/res/drawable/bg_new_button.xml new file mode 100644 index 0000000..d8d9f22 --- /dev/null +++ b/app/src/main/res/drawable/bg_new_button.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_reminder_card.xml b/app/src/main/res/drawable/bg_reminder_card.xml new file mode 100644 index 0000000..320bf5d --- /dev/null +++ b/app/src/main/res/drawable/bg_reminder_card.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_reminder_hero.xml b/app/src/main/res/drawable/bg_reminder_hero.xml new file mode 100644 index 0000000..b657106 --- /dev/null +++ b/app/src/main/res/drawable/bg_reminder_hero.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_reminder_info_card.xml b/app/src/main/res/drawable/bg_reminder_info_card.xml new file mode 100644 index 0000000..b8ae69e --- /dev/null +++ b/app/src/main/res/drawable/bg_reminder_info_card.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_search.xml b/app/src/main/res/drawable/bg_search.xml new file mode 100644 index 0000000..02d1b61 --- /dev/null +++ b/app/src/main/res/drawable/bg_search.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_service_card.xml b/app/src/main/res/drawable/bg_service_card.xml new file mode 100644 index 0000000..b7ef8b0 --- /dev/null +++ b/app/src/main/res/drawable/bg_service_card.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_service_icon.xml b/app/src/main/res/drawable/bg_service_icon.xml new file mode 100644 index 0000000..d96bf64 --- /dev/null +++ b/app/src/main/res/drawable/bg_service_icon.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_service_icon_alt.xml b/app/src/main/res/drawable/bg_service_icon_alt.xml new file mode 100644 index 0000000..a5864aa --- /dev/null +++ b/app/src/main/res/drawable/bg_service_icon_alt.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_tab_active.xml b/app/src/main/res/drawable/bg_tab_active.xml new file mode 100644 index 0000000..e543855 --- /dev/null +++ b/app/src/main/res/drawable/bg_tab_active.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/logo_bem_temp.xml b/app/src/main/res/drawable/logo_bem_temp.xml new file mode 100644 index 0000000..5e10ada --- /dev/null +++ b/app/src/main/res/drawable/logo_bem_temp.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_ringing.xml b/app/src/main/res/layout/activity_alarm_ringing.xml new file mode 100644 index 0000000..e1c6cfe --- /dev/null +++ b/app/src/main/res/layout/activity_alarm_ringing.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + +