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 diferem das configurações do telefone ( packages/apps/Settings ). Embora as configurações do carro contenham algumas configurações familiares do telefone, as configurações do carro fornecem uma interface de usuário visual personalizada para o carro , otimizações de distração do motorista e vários pontos de entrada de personalização para OEMs.

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

Arquitetura e diretrizes

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

Preferências estáticas

Uma preferência estática é definida em XML usando a marca 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 como LogicalPreferenceGroup para definir um conjunto de preferências que são geradas e controladas por Preference Controllers .

Dentro do aplicativo CarSettings, as preferências dinâmicas representam um conjunto normal de preferências que direcionam o usuário para páginas adicionais dentro do CarSettings, mas que foram adicionadas por meio do Preference Controller em vez de no XML. Um exemplo é a preferência Gerenciar teclados na preferência Idiomas e entrada que adiciona dinamicamente métodos de entrada à página de preferências com base em se esses métodos de entrada são permitidos ou não.

Barras de ação

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

Widgets de ação suplementares são classes MenuItem e devem ser criados no onCreate do respectivo SettingsFragment ou BaseFragment . Propriedades como visibilidade, estado e assim por diante devem 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 vêm com suporte para otimização de distração nas configurações do carro . Defina as UXRestrictions no MenuItem.Builder na criação.

Controladores de preferência

Cada página de configurações pode conter várias Preferências . Para ajudar a manter a organização do código, cada preferência ou um grupo relacionado de preferências tem um PreferenceController associado a ele.

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

Componentes de configurações do carro

Figura 1. Componentes CarSettings

O PreferenceController é um componente ciente do ciclo de vida que ajuda a encapsular a lógica de negócios pertencente a preferências específicas. PreferenceControllers só podem ser anexados à Preference relevante por meio de 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 meio de código para facilitar a modificação da hierarquia de configurações com alterações mínimas no código Java.

É possível que um PreferenceController precise de alguns dados dinâmicos para operar corretamente. Por exemplo, um PreferenceController que desativa as notificações de um aplicativo precisa saber em qual aplicativo agir. Como PreferenceControllers sempre são definidos em XML, não há como fornecer argumentos de construtor adicionais. Em vez disso, esses valores adicionais são fornecidos por meio de 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 frequentemente o método use(...) é usado, mais difícil se torna manter o objetivo original de poder reorganizar a hierarquia de configurações com alterações mínimas no código Java, uma vez que grandes seções do código de fragmento existente precisarão ser copiado para o fragmento recém-criado. Uma maneira de minimizar a dificuldade de fazer isso é:

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

Manipulação de intenção

Todas as intenções que devem ser tratadas pelo aplicativo Car Settings são definidas no arquivo de manifesto . As intenções geralmente são definidas e tratadas como a maioria dos aplicativos Android padrão, com todas as atividades e filtros de intenção definidos no manifesto.

Alterando o fragmento raiz

Por padrão, as configurações do carro mostram o HomepageFragment quando o aplicativo é iniciado. Isso pode ser configurado para ser o QuickSettingFragment invertendo os valores booleanos para config_is_quick_settings_root , config_enable_home_settings_icon e config_enable_quick_settings_icon .

Se desejado, o ícone Sair pode ser exibido ou ocultado usando config_show_settings_root_exit_icon .

Personalizando o tema

Personalizando outros atributos e recursos

O aplicativo Car Settings usa principalmente o CarSettingTheme , que é uma extensão do Theme.CarUi . Este tema é usado para padronizar a aparência dos aplicativos do sistema para garantir consistência no sistema.

Personalizando preferências

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

  • O layout de algumas classes de preferências básicas é definido em car_preference e sobreposto para construções de carros. Quaisquer layouts de personalização para as classes de preferência base podem ser substituídos aqui.
  • As configurações do carro usam algumas preferências personalizadas definidas principalmente no pacote common . Eles devem ser sobrepostos no módulo Configurações do carro separadamente das classes de preferência básicas.