Notificações
Central de notificações do usuário. Exibe mensagens recebidas via push (FCM) com filtro por estado de leitura, cache offline e marcação em massa como lida.
Filtros de Leitura
O fragment inicia com o filtro Não Lidas selecionado por padrão. Três chips mutuamente exclusivos controlam a lista exibida:
| Chip | FilterType | Lista exibida |
|---|---|---|
| Todas | ALL | Todas as notificações carregadas |
| Não Lidas | UNREAD | notifications.filter { !it.read } |
| Lidas | READ | notifications.filter { it.read } |
Fluxo de Carregamento
Verifica conectividade (delay de 1 segundo)
Usa ConnectivityManager.activeNetworkInfo para detectar se há rede disponível.
Com rede — busca da API
notificationsView.getUserNotification(user_id) → GET api.monisat.online/notificationByUser/{user_id}. Os dados são salvos no cache local após receber.
Sem rede — carrega cache
Lê o JSON salvo em SharedPreferences("notification_cache"), chave "notifications". Exibe somente as notificações não lidas do cache.
Estado Vazio
A TextView notificationEmpty é exibida quando a lista filtrada está vazia, com mensagem contextual:
| Filtro ativo | Mensagem | String resource |
|---|---|---|
| ALL | "Não há notificações" | R.string.nao_ha_notificacoes |
| UNREAD | "Todas as notificações foram lidas" | R.string.todas_lidas_notificacoes |
| READ | "Não há notificações lidas" | R.string.nao_ha_notificacoes_lidas |
Marcação como Lida
Duas formas de marcar como lida:
- Individual: clicar em uma notificação marca como lida e navega para
nav_notification_detail. Se o filtro UNREAD estiver ativo, o item é removido da lista após a leitura. - Em massa: botão
markAll— exibido somente quando há notificações não lidas. AbreAlertDialogde confirmação antes de chamarmarkAllNotificationsAsRead().
Badge de Notificações
Ao abrir o fragment, o badge é zerado via SharedPreferences("count") e um LocalBroadcast ("atualizar_contador") é enviado para que a HomeFragment atualize o contador no header.
// Zera o badge ao entrar no fragment
sharedPreferences("count").edit().putInt("count", 0).apply()
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent("atualizar_contador"))
Timestamps Relativos
O campo timestamp do modelo é Unix epoch em segundos. A função updateTimeRelative(timestampSeconds) converte para texto legível:
| Diferença | Texto exibido |
|---|---|
| < 60 min | "X minutos atrás" |
| < 24 h | "X horas atrás" |
| = 1 dia | "Ontem" |
| < 7 dias | "X dias atrás" |
| ≥ 7 dias | "Mais de uma semana" |
Modelo de Dados
data class NotificationData(
val id: String,
val title: String,
val body: String,
val timestamp: Long, // Unix epoch (segundos)
var read: Boolean,
val userId: String,
val notificationId: String,
val extra: Long // campo reservado
)
Endpoints
https://api.monisat.online/notificationByUser/{user_id}
[{
"id": "...",
"notification": {
"title": "...",
"body": "...",
"notification_id": "...",
"read": false,
"user_id": "...",
"@timestamp": 1234567890 // Unix epoch (segundos)
}
}]
api.monisystem.com/v1. Autenticação via URL sem header.https://api.monisat.online/markAsRead/{notification_id}
{}). Chamado individualmente ao clicar e em lote ao usar "Marcar todas como lidas".Cache Offline
| SharedPreferences | Chave | Conteúdo |
|---|---|---|
notification_cache | notifications | JSON serializado de ArrayList<NotificationData> via Gson |
count | count | Contador de notificações não lidas (zerado ao abrir o fragment) |
user_id | user_id | ID do usuário — passado como parâmetro da chamada à API |