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

Antes de continuar, leia as Diretrizes sobre distrações ao dirigir.

Esta página descreve as regras de restrições de experiência do usuário (UX) do carro que podem ser usadas para criar várias configurações de regras de restrições de UX (por exemplo, União Europeia x Japão) e, em seguida, determinar qual conjunto de regras será aplicado no momento da execução. Para mais informações, consulte CarUxRestrictions.

O serviço de restrições de UX do carro permite que os desenvolvedores definam uma nova configuração de restrições de UX do carro. Se um desenvolvedor quiser modificar as regras de restrição (por exemplo, para obedecer a padrões de segurança locais), ele poderá usar a API para definir a nova configuração.

A API para definir a configuração persiste apenas 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á em "Estacionar". O serviço de carro garante que o carro esteja em "Estacionamento" antes de recarregar a nova configuração.

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

  • Estacionado. Gear in Park.
  • Inatividade. A marcha não está em "Estacionamento" e a velocidade é zero.
  • Mover. A marcha não está em "Estacionamento" e a velocidade não é zero.

Para saber como os apps consomem o estado de direção de um carro e as restrições de UX correspondentes, consulte Como consumir o estado de direção de um carro e as restrições de UX.

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

Para evitar distrações, 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. Ilimitado.
  • Inatividade. Nenhum vídeo e nenhuma tela de configuração.
  • Mover. Restrição total (todas as restrições são obrigatórias).

O mapeamento ilustrado acima é predeterminado e configurado como um recurso XML. O /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java salva as regras na memória. Em seguida, o serviço mapeia o estado de direçã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árias telas

Por padrão, nenhuma restrição é aplicada a telas adicionais. Para criar configurações de restrição para várias telas, inclua a tag RestrictionMapping com a porta física para essa tela. As restrições adequadas são aplicadas automaticamente a cada tela. No exemplo abaixo, as telas com os IDs de porta físicos 1 e 2 têm 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 escolher qualquer nome para o modo, como adolescente. No exemplo abaixo, diferentes restrições são configuradas para os modos padrão e passageiro. Anteriormente, apenas o modo passageiro era aceito:

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

APIs CarUxRestrictionsConfiguration

Restrições com CarUxRestrictionsConfiguration

A nova classe CarUxRestrictionsConfiguration é mapeada 1:1 para o esquema de configuração XML atual. A CarUxRestrictionsConfiguration pode ser construída 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. Esse método requer permissão, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

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

Quando uma nova configuração é transmitida, o serviço de restrições de UX retorna um booleano para indicar se a nova configuração foi salva. Essa nova configuração só é usada quando a unidade principal integrada (IHU, na sigla em inglês) é reiniciada e o carro está estacionado. Internamente, o serviço de restrições de UX contém dois conjuntos de configurações:

  • Produção. Embora opcional, essa configuração geralmente está presente. O serviço de restrições de UX lê essa configuração ao iniciar.
  • Em etapas. Também opcional, essa configuração não tem efeito nas restrições de UX e é promovida para produção quando o serviço de carro começa e quando o carro está estacionado.

Configuração de produção

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

Lidar com falhas

Até que as informações do estado de direção sejam recebidas do CarPropertyManager (por exemplo, durante a inicialização), as restrições de UX não serão aplicadas. O sistema se comporta 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 de restrições de UX voltará ao modo totalmente restrito e codificado:

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

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

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

Interações com o estado de direção

Figura 2. Interações com o estado de direção

Propriedades usadas para derivar o estado de direção

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

APIs disponíveis para apps

O código está nos seguintes locais:

Código Local
CarUxRestrictionsManager
APIs públicas para registro de mudanças 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 registrar mudanças de estado.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

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