Implementar a interface do sistema

O Android Automotive oferece uma nova IU do sistema desenvolvida especificamente para veículos. A maioria dos componentes da IU do sistema estão intimamente acoplados aos serviços de framework. A interface do sistema se refere a qualquer elemento exibido na tela que não faça parte de um app. A interface do sistema Automotive (no pacote de elementos CarSystemUI) é uma extensão da interface do sistema Android (no pacote de interface do sistema), que foi personalizada especificamente para veículos.

O que é a IU do sistema?

Os componentes específicos da interface do sistema automotivo incluem:

Componente Descrição
Interface da tela de bloqueio Tela em que os usuários são autenticados em uma conta de usuário específica.
Barra de navegação Barra de sistema que pode ser posicionada à esquerda, na parte inferior ou à direita da tela e que pode incluir botões de faceta para navegação em diferentes apps, alternar o painel de notificações e fornecer controles do veículo (como HVAC). Isso é diferente da implementação da interface do sistema Android, que fornece os botões "Voltar", "Tela inicial" e "Pilha de apps".
Barra de status Barra do sistema posicionada ao longo da tela e que serve como uma barra de navegação. A barra de status também oferece funcionalidade para oferecer suporte a:
  • Ícones de conectividade. incluindo Bluetooth, Wi-Fi e conexão de ponto de acesso/rede móvel.
  • Painel de notificações suspenso. Por exemplo, deslizando de cima para baixo na tela.
  • Notificações de alerta (HUN).
Interface do sistema Se refere a qualquer elemento exibido na tela que não faz parte de um app.
Interface do seletor de usuário Tela em que um usuário pode selecionar outro usuário.
Interface do volume Caixa de diálogo exibida quando o driver usa botões físicos de volume para mudar o volume em um dispositivo.

Como a interface do sistema funciona?

A interface do sistema é um app Android que é executado quando um dispositivo é ligado. O app é iniciado por reflexão pelo SystemServer. Confira abaixo os pontos de entrada mais relevantes para aspectos visíveis ao usuário da interface do sistema. Use esses componentes para personalizar a interface do sistema Android para recursos específicos de veículos.

  • config_statusBarComponent
  • config_systemUIFactoryComponent

O CarSystemUI é uma extensão do pacote System UI, o que significa que as classes e os recursos no pacote System UI podem ser usados e substituídos pelo pacote CarSystemUI.

Personalizar a interface do sistema

Sobreposições

Embora seja possível modificar o código-fonte do Android para personalizar a interface do sistema, isso dificulta e torna mais complexo aplicar atualizações futuras do Android. Em vez disso, o Android oferece suporte ao uso de um diretório de sobreposição, que permite substituir arquivos de recursos sem modificar o código-fonte. No sistema de build do Android, o sistema de sobreposição substitui os arquivos de maneira controlada. Todos os arquivos modificados são claramente identificados sem percorrer toda a árvore do código-fonte do AOSP.

Os arquivos de sobreposição precisam ser colocados no diretório PRODUCT_PACKAGE_OVERLAYS e ter exatamente as mesmas subpastas da estrutura raiz original do AOSP. No Android 10 ou mais recente, PRODUCT_PACKAGE_OVERLAYS é definido como:

PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay

A interface do sistema veicular usa recursos da interface do sistema e dos pacotes CarSystemUI, o que significa que os recursos de cada local podem ser substituídos por sobreposições para afetar a aparência da interface do sistema veicular.

Para substituir um arquivo, replique a estrutura de diretórios do arquivo a ser substituído no diretório /overlay especificado e inclua a substituição nesse diretório. Por exemplo, para substituir:

frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml

Adicione o arquivo super_status_bar.xml de substituição localizado em:

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

Para substituir frameworks/base/packages/SystemUI/res/values/config.xml, (na IU do sistema, não CarSystemUI), adicione o arquivo config.xml de substituição a:

packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/

ou

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

Confira abaixo as descrições dos dois pontos de entrada principais de personalização.

A interface do sistema automotivo pode ter três barras de navegação à esquerda, na parte inferior e à direita da tela. A visibilidade de cada barra do sistema é alternada com as seguintes configurações:

  • config_enableLeftSystemBar
  • config_enableBottomSystemBar
  • config_enableRightSystemBar

Cada barra tem um estado provisionado e não provisionado, que pode ser personalizado sobrepondo os respectivos arquivos de layout:

  • car_left_system_bar.xml
  • car_left_system_bar_unprovisioned.xml
  • car_system_bar.xml (layout para a barra de navegação inferior)
  • car_system_bar_unprovisioned.xml
  • car_right_system_bar.xml
  • car_right_system_bar_unprovisioned.xml

Esses layouts precisam conter com.android.systemui.car.systembar.CarSystemBarView no nível superior, que pode incluir todas as outras visualizações necessárias. Os botões nas barras de navegação podem ser incluídos usando com.android.systemui.car.systembar.CarSystemBarButton.

Essas visualizações são infladas em CarSystemBar#createSystemBar, se o dispositivo estiver provisionado corretamente para um determinado usuário.

Barra de status

Considere a barra de status como uma barra de navegação com mais funcionalidades. Ao contrário da barra de navegação, a barra de status não tem uma flag para desativá-la. É possível modificar a barra de status com:

  • car_top_navigation_bar.xml
  • car_top_navigation_bar_unprovisioned.xml

Esses layouts precisam conter com.android.systemui.statusbar.car.CarNavigationBarView no nível superior. A barra de status contém ícones de status. Para mudar o tamanho de um ícone, especifique uma escala uniforme com um fator de escala em vez de especificar um tamanho específico. Por exemplo, em um arquivo de sobreposição /overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml, adicione as seguintes dimensões para dobrar o tamanho dos ícones:

<resources>
    <!-- The amount by which to scale up the status bar icons.-->
    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item>
</resources>

A barra de status fica em uma camada de janelas especial que também inclui o painel de notificações, o seletor de usuários, as notificações heads-up (HUNs) e a tela de bloqueio. Os vários layouts para eles estão incluídos em super_status_bar.xml.

Mudanças no código-fonte da interface do sistema

As sobreposições podem não oferecer a flexibilidade necessária para personalizar o comportamento da IU do sistema.

Alerta. As mudanças feitas no código-fonte do Android são difíceis de atualizar nas versões mais recentes do Android. É altamente recomendável estender o código da interface do sistema automotivo em vez de modificar o código diretamente. Dessa forma, o código-fonte da interface do sistema automotivo pode ser atualizado com conflitos mínimos de mesclagem, porque todas as personalizações são implementadas por superfícies de API conhecidas.

A maioria dos aspectos da interface do sistema pode ser personalizada por esses dois pontos de entrada:

  • config_statusBarComponent
  • config_systemUIFactoryComponent

Por exemplo, se você criar uma classe chamada com.android.systemui.statusbar.car.custom.CustomCarStatusBar, que estende CarStatusBar, atualize config_statusBarComponent para apontar para esse novo componente. A extensão dessa classe permite a personalização da maioria dos elementos relacionados à barra do sistema e à lógica de notificações.

Da mesma forma, é possível criar CustomCarSystemUIFactory e colocá-lo em config_systemUIFactoryComponent. Use essa classe para atualizar a funcionalidade do VolumeUI e da tela de bloqueio.

Personalizar a troca e o desbloqueio de usuários

O material a seguir descreve como personalizar a experiência de troca de usuário.

Termo Descrição
Bloqueio do teclado Caixa de diálogo em tela cheia para evitar a interação acidental com o app em primeiro plano. Protege a privacidade de cada usuário quando vários usuários são configurados.
Caixa de diálogo de carregamento Tela de carregamento exibida ao alternar entre usuários.
Tela de bloqueio, bouncer Tela que exige que uma pessoa insira um PIN, padrão ou senha.
Usuário Usuário do Android.
Seletor de usuários Tela de seleção de usuário exibida quando um dispositivo é inicializado.
Troca de usuário Troca de usuário exibida ao alternar entre telas nas Configurações rápidas.

Personalizar a troca de usuário

Bloqueio do teclado e proteção contra acesso não autorizado

No Android Automotive OS, a tela de bloqueio com um seletor de usuário é mostrada somente quando um usuário clica no botão "Cancelar" na tela de bloqueio. A tela de bloqueio é mostrada abaixo.

Tela de bloqueio do teclado

Figura 1. Tela de bloqueio

Uma tela de bloqueio com um protetor é exibida quando o usuário seleciona um tipo de privacidade para desbloquear o dispositivo, conforme mostrado abaixo.

Tela de bloqueio

Figura 2. Tela de bloqueio.

Quando a fechadura estiver configurada para acionar manualmente a energia, use a seguinte instrução:

adb shell input keyevent 26

Seletor de usuários

A tela de seleção de usuários aparece quando um dispositivo integrado à barra de status da interface do sistema do carro e o Maps são reiniciados. Para saber mais, consulte FullscreenUserSwitcher.

Tela de carregamento

Figura 3. Tela do seletor de usuários

O layout dessa tela pode ser personalizado em car_fullscreen_user_switcher.xml.

Tela de carregamento

A tela de carregamento aparece sempre que um usuário é trocado, independente do ponto de entrada. Por exemplo, pelo seletor de usuários ou pela tela "Configurações". A tela de carregamento é parte integrante da interface do sistema do framework e é mapeada para a classe pública CarUserSwitchingDialog. Confira a Figura 3 acima para ver um exemplo.

O tema pode ser personalizado com o Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog.

Para configurar o usuário do Android, o fluxo inicial do Assistente de configuração permite que o motorista defina um nome de usuário para si mesmo. Se o motorista associar o usuário do Android a uma Conta do Google, o nome do usuário será selecionado nessa conta. No entanto, se o motorista especificar um nome, por exemplo, MotoristaB, e depois associar esse nome de usuário à Conta do Google com o nome de Maddy, o nome atribuído originalmente (MotoristaB) não será alterado porque foi definido explicitamente. O motorista só pode mudar o nome no menu "Configurações".

O layout pode ser personalizado em car_user_switching_dialog.xml.

Os OEMs podem ocultar a barra de status e de navegação usando o tema NoActionBar.Fullscreen. Essa é a interface do sistema original, atualizada para a interface de referência do carro. Para mais informações, consulte Personalização.

Embora os OEMs possam fornecer pontos de entrada da interface do usuário para alternar usuários, às vezes os resultados podem ser indesejáveis. Se isso acontecer:

  1. O OEM cria e mostra a tela de carregamento (ou caixa de diálogo) personalizada.
    • Específico à UX, o OEM inicia a tela de carregamento personalizada quando um usuário seleciona a forma de alternância, que pode ser oculta quando a troca do usuário é concluída.
    • O OEM precisa definir a janela de prioridade de acordo com a preferência. Por exemplo, um tipo de janela de prioridade mais alta. A prioridade prioritária não pode exceder a do bloqueio de teclado.
  2. O OEM define config_customUserSwitchUi=true no framework principal config.xml, conforme descrito em config_customuserswitchui. Como resultado, o framework não exibe CarUserSwitchingDialog.

Personalizar a tela de bloqueio

A tela de bloqueio é uma parte integrante da interface do sistema, que pode ser personalizada pelo OEM. Para personalizar o fluxo, comece com frameworks/base/packages/CarSystemUI/.

Personalizar a configuração inicial do usuário

O assistente de configuração realiza a configuração do usuário pela primeira vez. Isso também pode ser personalizado. Você pode usar as APIs UserManager para criar um usuário. Em alguns casos, isso pode ser implementado em segundo plano, simplificando o processo do assistente de configuração.