API v1

Notificações

Android: NotificationFragment · NotificationViewModel · NotificationAdapter

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:

ChipFilterTypeLista exibida
TodasALLTodas as notificações carregadas
Não LidasUNREADnotifications.filter { !it.read }
LidasREADnotifications.filter { it.read }

Fluxo de Carregamento

1

Verifica conectividade (delay de 1 segundo)

Usa ConnectivityManager.activeNetworkInfo para detectar se há rede disponível.

2a

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.

2b

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 ativoMensagemString 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. Abre AlertDialog de confirmação antes de chamar markAllNotificationsAsRead().

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çaTexto 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

GET https://api.monisat.online/notificationByUser/{user_id}
Endpoint legado — sem autenticação Bearer. Retorna array JSON com notificações do usuário. Estrutura:
[{
  "id": "...",
  "notification": {
    "title": "...",
    "body": "...",
    "notification_id": "...",
    "read": false,
    "user_id": "...",
    "@timestamp": 1234567890   // Unix epoch (segundos)
  }
}]
Ainda não migrado para api.monisystem.com/v1. Autenticação via URL sem header.
PUT https://api.monisat.online/markAsRead/{notification_id}
Marca notificação como lida. Body vazio ({}). Chamado individualmente ao clicar e em lote ao usar "Marcar todas como lidas".

Cache Offline

SharedPreferencesChaveConteúdo
notification_cachenotificationsJSON serializado de ArrayList<NotificationData> via Gson
countcountContador de notificações não lidas (zerado ao abrir o fragment)
user_iduser_idID do usuário — passado como parâmetro da chamada à API