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.
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.