Restrições à experiência do usuário de carro

Antes de continuar, revise as Diretrizes para distração ao dirigir .

Esta página descreve as regras de restrições de experiência do usuário do carro (UX) que você pode usar para criar várias configurações de regras de restrições de UX (por exemplo, União Europeia versus Japão) e, em seguida, determinar qual conjunto de regras aplicar em tempo de execução. Para obter mais informações, consulte CarUxRestrictions .

O serviço Car UX Restrictions permite que os desenvolvedores definam uma nova configuração de Car UX Restrictions. Caso um desenvolvedor queira modificar as regras de restrição (como para cumprir os padrões de segurança locais), o desenvolvedor poderá usar a API para definir a nova configuração.

A API para definir a configuração persiste somente na nova configuração. Em outras palavras, a configuração não entra em vigor imediatamente. Em vez disso, a nova configuração é carregada quando o serviço de restrições de UX é reiniciado e o carro está estacionado. O serviço de carro garante que o carro esteja estacionado antes de recarregar a nova configuração.

Além do novo método de serviço Restrições de UX, são fornecidas APIs para construir a configuração. O estado de seleção de marcha e velocidade é convertido em um dos três estados de condução:

  • Estacionado. Engrenagem no parque.
  • Inativo. A marcha não está estacionada e a velocidade é zero.
  • Movendo-se. A marcha não está estacionada e a velocidade não é zero.

Para saber como os aplicativos consomem o estado de direção de um carro e as restrições de UX correspondentes, consulte Consumindo o estado de direção do carro e as restrições de UX .

Configuração de restrição com base nos estados da unidade

Para evitar a distração do motorista, o Android mapeia o estado de direção para um conjunto de restrições de UX /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Estacionado. Irrestrito.
  • Inativo. Sem vídeo e sem tela de configuração.
  • Movendo-se. Totalmente restrito (todas as restrições são obrigatórias).

O mapeamento ilustrado acima é pré-determinado e configurado como um recurso XML. O /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java então salva as regras na memória. O serviço então mapeia o estado de condução atual para as restrições de UX e transmite as restrições atuais para todo o sistema.

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

Configurações para vários monitores

Por padrão, nenhuma restrição é aplicada a monitores adicionais. Para criar configurações de restrição para vários monitores, inclua a tag RestrictionMapping com a porta física desse monitor. As restrições apropriadas são aplicadas automaticamente a cada exibição. No exemplo a seguir, os displays com IDs de porta física 1 e 2 possuem configurações diferentes:

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

Configurações para modos de restrição

Você pode selecionar qualquer nome para o modo, como adolescente . No exemplo a seguir, diferentes restrições são configuradas para os modos padrão e passageiro (anteriormente, apenas o modo passageiro era suportado):

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
Você pode usar a API para definir qualquer nome de string para o modo. Por exemplo, o método setRestrictionMode(@NonNull String mode) em CarUxRestrictionsManager. (Anteriormente, você usaria o método setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) em CarUxRestrictionsManager).

APIs de configuração CarUxRestrictions

Restrições com CarUxRestrictionsConfiguration

A nova classe CarUxRestrictionsConfiguration é mapeada 1:1 para o esquema de configuração XML atual. CarUxRestrictionsConfiguration pode ser construído com CarUxRestrictions. Builder , que valida a configuração no build().

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

API CarUxRestrictionsManager

Defina CarUxRestrictionsConfiguration para a próxima unidade com CarUxRestrictionsManager . Este método requer permissão Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION .

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Persistir uma nova configuração de restrições de UX

Quando uma nova configuração é transmitida, o serviço Restrições de UX retorna um booleano para indicar se a nova configuração foi salva com êxito. Esta nova configuração só é utilizada quando a Unidade Principal Integrada (IHU) reinicia e o carro está estacionado. Internamente, o serviço Restrições de UX contém dois conjuntos de configurações:

  • Produção. Embora opcional, esta configuração está frequentemente presente. O serviço Restrições UX lê esta configuração ao iniciar.
  • Encenado. Também opcional, esta configuração não tem efeito nas Restrições UX e é promovida para Produção quando o serviço do carro é iniciado e quando o carro está estacionado.

Configuração de produção

Figura 1. Configuração de produção

Abordar falhas

Até que as informações do estado de condução sejam recebidas do CarPropertyManager (por exemplo, durante a inicialização), as restrições UX não serão aplicadas. O sistema funciona como se o estado de condução fosse Estacionado.

Se a leitura de uma configuração salva falhar (por exemplo, resultados de SettingNotFoundException), o serviço Restrições UX retornará ao modo totalmente restrito e codificado:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

Estado de condução e restrições de usuário

O conteúdo a seguir descreve as interações exibidas no diagrama de design a seguir:

Impulsionando interações de estado

Figura 2. Conduzindo interações de estado

Propriedades usadas para derivar o estado de condução

Use os três VehiclePropertyIds a seguir para derivar o estado de direção:

APIs disponíveis para aplicativos

O código reside nos seguintes locais:

Código Localização
CarUxRestrictionsManager
APIs públicas para registrar alterações nas restrições de UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Definição de restrições de UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
APIs do sistema para registro para conduzir mudanças de estado.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Para simular estados de direção, consulte Testes .