Configurações
Tela de perfil e configurações do usuário. Permite trocar de empresa ativa (com reresolução de permissões em tempo real), visualizar dados do perfil, acionar download de dados offline e fazer logout.
Funcionalidades
| Feature | Detalhe |
|---|---|
| Avatar com iniciais | Bitmap circular gerado dinamicamente com a inicial do nome. Cor aleatória persistida por usuário em SharedPreferences("user_prefs"). |
| Nome e CPF | CPF exibido mascarado XXX.XXX.XXX-XX. Nome lido de SharedPreferences("DATA"), chave "nome". |
| Troca de empresa | Spinner com apenas empresas ativas. Ao trocar, permissões são rerresolvidas e o HomeFragment é notificado via chamada direta ao fragment. |
| Troca de senha | Visível apenas para motoristas (driver == true). Navega para nav_change_pass (ChangePasswordFragment). |
| Download offline | Ícone com cor de status (verde=sucesso, vermelho=falha, azul=em andamento). Aciona 3 WorkManager workers em paralelo. |
| Logout | Limpa credenciais, token FCM e navega para nav_login. |
Troca de Empresa — Fluxo Detalhado
Filtragem de empresas ativas
configurationViewModel.filterActiveCompanies(arrayList) — remove empresas inativas antes de popular o spinner. Se nenhuma empresa ativa for encontrada, o spinner é ocultado.
Resolução de permissões (assíncrono)
Loading overlay exibido. Identifica papel (master / motorista / padrão) e calcula permissões igual ao fluxo do Login. Salva em SharedPreferences("DATA"), chave "perms_user".
Persistência de papel
Salva flags nos SharedPreferences: "master", "responsavel" e "driver". Controla visibilidade do botão de troca de senha.
Notificação do HomeFragment
Localiza o HomeFragment via NavHostFragment.childFragmentManager e chama fragment.onCompanySelected(companyId, isDriver). Se não encontrado, salva em "pending_company_change" para ser aplicado no próximo onResume da Home.
Workers de Download Offline
O botão de download aciona 3 workers do WorkManager em paralelo:
| Worker | Dados baixados |
|---|---|
TripDriverWorkService | Dados de motoristas |
TripAtributtedWorkService | Viagens atribuídas |
TripCoordinatesWorkService | Coordenadas de rotas |
O ícone de download reflete o estado do worker mais recente:
| Estado WorkManager | Cor do ícone |
|---|---|
SUCCEEDED | Verde |
FAILED | Vermelho |
RUNNING | Azul |
ENQUEUED | Cinza claro |
O status é persistido em SharedPreferences("MyAppData"), chave "data", para exibição correta ao reabrir a tela.
Logout — o que é limpo
// SharedPreferences "DATA"
remove("nome", "user_id", "token_credentials", "user_perms", "user_perms_json")
// SharedPreferences "ButtonLayout"
remove("buttonList")
// SharedPreferences "loginPrefs" (se saveLogin == true)
remove("password")
// SharedPreferences "biometrics"
remove("bio")
// Firebase FCM
FirebaseMessaging.getInstance().deleteToken()
Avatar — imageNameColor()
Gera um Bitmap 120×120px com círculo colorido e inicial em branco. A cor é determinada por:
- Lê cor persistida em
SharedPreferences("user_prefs")com a chave sendo o nome completo do usuário. - Se não existe, gera uma cor aleatória RGB.
- Salva a cor gerada para manter consistência entre sessões.
SharedPreferences relevantes
| Nome | Chave | Uso |
|---|---|---|
DATA | nome, cpf | Dados de exibição do perfil |
DATA | company_names | JSON de empresas para o spinner (Array<CompanyData>) |
DATA | user_perms_json | JSONObject com permissões por empresa — fonte para resolução |
DATA | sectors | JSONArray de setores do usuário |
DATA | perms_user | JSON array final de IDs de permissão (escrito ao trocar empresa) |
selected_company | company_id | Empresa ativa — atualizada ao trocar |
master | master | Boolean — atualizado ao trocar empresa |
driver | driver | Boolean — controla visibilidade de "Trocar Senha" |
responsavel | responsavel | Boolean — papel de responsável |
credentials | token_credential | Token legado da empresa — atualizado ao trocar empresa |
user_prefs | {nome_usuario} | Cor do avatar (Int) por nome de usuário |
MyAppData | data | Status do último download offline |