API v1

Grid de Viagens

Android: GridTripFragment · GridTripViewModelNew · GridTripAdapter

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

ClasseResponsabilidade
GridTripFragmentUI — RecyclerView, SearchView, botões de filtro e reload
GridTripViewModelNewBusca v1 com JWT, paginação e cache
GridTripAdapterRenderização dos cards de viagem (GridTrip)
GridCacheManagerCache local em SharedPreferences para uso offline
GridFilterObjeto de filtros acumulados (status, data, placa)
FilterDialogBottom sheet de filtro avançado

Fluxo de Carregamento

1

Inicialização

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.

2

Exibição do Dialog de processamento

ApiProcessingDialog é exibido com mensagem "Carregando viagens / Buscando veículos rastreadores". Tem botões de Cancelar e Tentar Novamente.

3

Chamada à API v1

gridTripsViewModelNew.fetchData(companyId, jwt, forceRefresh). Com forceRefresh = false usa cache se disponível; com true sempre busca da API.

4

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

GET /v1/trips?page=N&status=...&vehicle_id=...
Lista paginada de viagens. Resposta: { "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

NomeChaveUso
jwt_tokensjwt_tokenBearer JWT para chamadas à API v1
selected_companycompany_idEmpresa selecionada — filtro principal
O 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.