Grid de Viagens
Lista de todas as viagens da empresa em cards filtráveis por status, data e veículo. Suporta cache offline, filtro avançado com badge de contagem e busca textual por placa.
Componentes Principais
| Classe | Responsabilidade |
|---|---|
GridTripFragment | UI — RecyclerView, SearchView, botões de filtro e reload |
GridTripViewModelNew | Busca v1 com JWT, paginação e cache |
GridTripAdapter | Renderização dos cards de viagem (GridTrip) |
GridCacheManager | Cache local em SharedPreferences para uso offline |
GridFilter | Objeto de filtros acumulados (status, data, placa) |
FilterDialog | Bottom sheet de filtro avançado |
Fluxo de Carregamento
Inicialização
Lê company_id de SharedPreferences("selected_company") e jwt_token de SharedPreferences("jwt_tokens"). Se company_id estiver vazio, tenta usar o último company_id registrado no ViewModel.
Exibição do Dialog de processamento
ApiProcessingDialog é exibido com mensagem "Carregando viagens / Buscando veículos rastreadores". Tem botões de Cancelar e Tentar Novamente.
Chamada à API v1
gridTripsViewModelNew.fetchData(companyId, jwt, forceRefresh). Com forceRefresh = false usa cache se disponível; com true sempre busca da API.
Aplicação de filtros e busca
Os dados são filtrados localmente em memória pelo objeto activeFilter e pelo texto digitado no SearchView.
Cache Offline
O GridCacheManager persiste os dados da última requisição bem-sucedida em SharedPreferences. Na próxima abertura sem forçar reload, os dados em cache são exibidos imediatamente enquanto a API é consultada em background.
Filtro Avançado
O FilterDialog abre como bottom sheet e permite filtrar por:
- Status da viagem (múltiplos chips selecionáveis)
- Intervalo de datas (MaterialDatePicker)
- Placa do veículo
O badge numérico no botão de filtro exibe a quantidade de filtros ativos. Os filtros são persistidos em SharedPreferences e restaurados ao reabrir o fragment.
Busca por Placa
O SearchView filtra a lista já carregada por placa em tempo real (onQueryTextChange). A busca é combinada com os filtros ativos do FilterDialog.
Tanto a busca quanto o campo de placa do FilterDialog usam PlateUtils para tratar formato antigo e Mercosul como equivalentes (ex.: MSM2020 ↔ MSM2A20) — detalhes em Histórico.
Endpoint
/v1/trips?page=N&status=...&vehicle_id=...
{ "page": N, "count": total, "data": [...] }. O ViewModel acumula páginas até esgotar os resultados ou atingir o limite configurado.
Modelo de Dados
data class GridTrip(
val id: String,
val plate: String, // placa do veículo
val status: String, // "I" | "F" | "C" | "A" | ...
val statusLabel: String,
val origin: String,
val driverName: String,
val startDatetime: Long?, // Unix epoch (segundos)
val endDatetime: Long?,
val company: String,
)
SharedPreferences relevantes
| Nome | Chave | Uso |
|---|---|---|
jwt_tokens | jwt_token | Bearer JWT para chamadas à API v1 |
selected_company | company_id | Empresa selecionada — filtro principal |
GridTripFragment também importa OSMDroid (Configuration.getInstance()) para inicializar a configuração do mapa usada nos detalhes de viagem. Essa inicialização ocorre no onCreateView mesmo sem exibir mapa.
Detalhe da Viagem — Pontos autorizados e áreas de risco
Ao abrir uma viagem, o DetailsGridFragment renderiza o mapa (OSMDroid) com a rota e, além dela, os pontos autorizados e as áreas de risco da viagem — a mesma feature das telas de Motorista e Gestor.
| Elemento | Como é desenhado |
|---|---|
| Pontos autorizados | Marker em stopPointMarkers, atualizados em updateStopPointMarkers(points); pino azul com caixa para type_return == "delivery". |
| Áreas de risco | Polygon vermelho em riskAreaPolygons (itens type_return == "risk_area"). |
Reaproveita StopPointData (de ui.driver) e RiskAreaData (de ui.manager) e o mesmo endpoint consolidado das outras telas.
GET /v1/trip/{tripId}/rotogram — data[] { points, apolice_rules.risk_points, deliveries }. Ainda em http://nginx.surubim.monisat.online/v1; pendente troca para produção https://api.monisystem.com/v1. Contrato completo em Mapa.DetailGridViewController.swift (MKPolygon para áreas de risco + StopPointAnnotation para pontos).