Visão geral

As configurações do carro (packages/apps/Car/Settings) são fornecidas especificamente para o Android Automotive OS (AAOS). As configurações do carro são diferentes das configurações do smartphone (packages/apps/Settings). Embora as configurações do carro contenham algumas configurações conhecidas do smartphone, elas oferecem uma interface do usuário para carros, otimizações para distrações do motorista e vários pontos de entrada de personalização para OEMs.

Além da visão geral das configurações do carro fornecida abaixo, consulte estes tópicos relacionados para saber mais sobre as configurações do carro:

Arquitetura e diretrizes

A maioria das páginas em "Configurações do carro" é implementada como uma série de fragmentos que estendem SettingsFragment, cada um com a própria atividade definida em CarSettingActivities. Essas atividades estáticas são estendidas de BaseCarSettingsActivity. Embora haja algumas exceções a essa regra, como alguns fragmentos especiais que estendem BaseFragment em vez de SettingsFragment e algumas atividades que residem fora das CarSettingActivities, todas elas devem ser consideradas exceções (não como padrões a serem seguidos).

Preferências estáticas

Uma preferência estática é definida em XML usando a tag Preference ou CarUiPreference. Uma implementação de SettingsFragment usa o método getPreferenceScreenResId() para definir qual arquivo XML contém a lista estática de preferências a serem exibidas.

Preferências dinâmicas

As preferências dinâmicas usam a tag PreferenceGroup ou uma implementação de PreferenceGroup.

No app CarSettings, as preferências dinâmicas representam um conjunto normal de preferências que direcionam o usuário a outras páginas no CarSettings, mas que foram adicionadas pelo Preference Controller em vez de no XML. Um exemplo é a preferência "Gerenciar teclados" em "Idiomas e preferências de entrada", que adiciona dinamicamente métodos de entrada à página de preferências com base na permissão ou não desses métodos.

Barras de ações

A parte de cima de cada tela de configurações tem uma barra de ações, que pode conter uma navegação "voltar", um título de tela e widgets de ação complementares (por exemplo, botões e interruptores). Essas barras de ação são semelhantes à ActionBar fornecida pelo Android, mas são visualizações personalizadas. No Android 11 e versões mais recentes, essa barra de ferramentas está incluída no layout de base do chassi, que contém as visualizações para a barra de ferramentas e um framelayout para o restante do conteúdo do app.

Os widgets de ação suplementar são classes MenuItem e precisam ser criados no onCreate do SettingsFragment ou BaseFragment correspondente. Propriedades como visibilidade, estado e assim por diante precisam ser controladas por setters na lógica de negócios do SettingsFragment.

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

    @Override
    protected List<MenuItem> getToolbarMenuItems() {
        return Collections.singletonList(mClearConfirmButton);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mButton = new MenuItem.Builder(getContext())
                .setTitle(R.string.text)
                .setOnClickListener(mOnClickListener)
                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
                .build();
    }

    private void updateState() {
        button.setVisible(false);
    }
}

As barras de ação têm suporte para Otimização de distração nas configurações do carro. Defina as UXRestrictions no MenuItem.Builder na criação.

Controladores de preferências

Cada página de configurações pode conter várias preferências.

Confira a imagem a seguir para saber como esses componentes estão relacionados:

Componentes do CarSettings

Figura 1. CarSettings Components

O PreferenceController é um componente ciente do ciclo de vida que ajuda a encapsular a lógica de negócios relacionada a preferências específicas. O PreferenceControllers só pode ser anexado à preferência relevante por XML.

// example_settings_fragment.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/example_settings_title">
  <Preference
    android:key="@string/pk_example_preference_key"
    android:title="@string/example_preference_title"
    settings:controller="com.android.car.settings.example.ExamplePreferenceController"/>
</PreferenceScreen>

As configurações do carro impedem explicitamente a criação de PreferenceController por código para facilitar a modificação da hierarquia de configurações com mudanças mínimas no código Java.

É possível que um PreferenceController precise de alguns dados dinâmicos para funcionar corretamente. Por exemplo, um PreferenceController que desativa as notificações de um app precisa saber em qual app agir. Como PreferenceControllers é sempre definido em XML, não há como fornecer outros argumentos de construtor. Em vez disso, esses valores adicionais são fornecidos por setters públicos no PreferenceController e definidos usando o método use(...) do SettingsFragment.

// ExamplePreferenceController.java
public class ExamplePreferenceContorller extends PreferenceController<Preference> {

  private ExampleArg mExampleArg;

  public ExamplePreferenceController(...) {
    ...
  }

  public void setExampleArg(ExampleArg exampleArg) {
    mExampleArg = exampleArg;
  }
}

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

  @Override
  @XmlRes
  protected int getPreferenceScreenResId() {
    Return R.xml.example_settings_fragment;
  }

  @Override
  public void onAttach(Context context) {
    ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY);
    ExamplePreferenceController controller =
        use(ExamplePreferenceController.class, R.string.pk_example_preference_key);
    controller.setExampleArg(arg);
  }
}

Quanto mais o método use(...) for usado, mais difícil será manter a meta original de reorganizar a hierarquia de configurações com mudanças mínimas no código Java, porque grandes seções do código do fragmento precisam ser copiadas para o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:

  • Reduza o uso de use(...).
  • Tente manter todas as chamadas para use(...) em um só lugar no fragmento (por exemplo, no método onAttach()).

Processamento de intents

Todas as intents que precisam ser processadas pelo app Configurações do carro são definidas no arquivo manifest. As intents geralmente são definidas e processadas como a maioria dos apps Android padrão, com todas as atividades e filtros de intent definidos no manifesto.

Mudar o fragmento raiz

Se desejar, o ícone de saída pode ser mostrado ou ocultado usando config_show_settings_root_exit_icon.

Personalizar o tema

Personalizar outros atributos e recursos

O app Configurações do carro usa principalmente o CarSettingTheme, que é uma extensão de Theme.CarUi. Esse tema é usado para padronizar a aparência dos apps do sistema e garantir a consistência no sistema.

Personalizar preferências

A personalização das preferências abrange estes outros locais:

  • O layout de algumas classes de preferências básicas é definido em car_preference e sobreposto para builds de carros. Todos os layouts de personalização das classes de preferências básicas podem ser substituídos aqui.
  • As configurações do carro usam algumas preferências personalizadas definidas principalmente no pacote common. Elas precisam ser sobrepostas no módulo "Configurações do carro" separadamente das classes de preferências básicas.