Criar experiências de mensagens com modelos para o Android Auto

As experiências de mensagens baseadas em modelo estão na versão Beta
No momento, qualquer pessoa pode publicar apps de comunicação com experiências de mensagens baseadas em modelo nas faixas de teste interno e teste fechado na Google Play Store. A publicação nas faixas de teste aberto e produção será permitida em uma data posterior.

Além da experiência básica de mensagens com notificações para ler e responder mensagens, o Android Auto oferece suporte a experiências de mensagens mais avançadas criadas usando a biblioteca Android para carros App.

Oferecer suporte a experiências de mensagens com notificações

Todos os apps que oferecem suporte a experiências de mensagens baseadas em modelo também precisam estender as notificações de mensagens para o Android Auto. Essa integração permite que os usuários leiam e respondam mensagens sem precisar abrir o app baseado em modelo.

Criar uma experiência de mensagens baseada em modelo

Siga as orientações em Usar a biblioteca Android para carros App e Adicionar suporte para Android Auto ao seu app baseado em modelo para começar a criar a experiência baseada em modelo do seu app. Em seguida, consulte as orientações nesta página para entender os requisitos específicos para apps de mensagens baseados em modelo.

Configurar os arquivos de manifesto do app

Para informar o Android Auto sobre os recursos do seu app, ele precisa fazer o seguinte:

Declarar suporte à categoria no manifesto

Seu app precisa declarar a androidx.car.app.category.MESSAGING categoria de app para carros no filtro de intent da classe CarAppService.

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MESSAGING"/>
      </intent-filter>
    </service>
    ...
<application>

Definir o nível mínimo da API de app para carros

Como a API ConversationItem só é compatível com a API Car 7 ou mais recente, defina os metadados minCarApiLevel para esse valor. Consulte Nível da API Car App para mais informações.

<application ...>
    ...
    <meta-data
        android:name="androidx.car.app.minCarApiLevel"
        android:value="7"/>
    ...
</application>

Declarar compatibilidade com o Android Auto

No arquivo automotive_app_desc.xml que você usa para declarar suporte ao Android Auto, verifique se os recursos notification e template estão declarados:

<automotiveApp>
    <uses name="notification" />
    <uses name="template" />
</automotiveApp>

Caso seu app possa ser definido como o gerenciador de SMS padrão, inclua o elemento <uses> abaixo. Se você não fizer isso, um gerenciador padrão integrado ao Android Auto será usado para processar mensagens SMS/MMS recebidas, o que pode levar a notificações duplicadas.

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

Mostrar conversas

Para mostrar uma visão geral das conversas de um usuário, você pode exibir uma lista de ConversationItem objetos em um ListTemplate ou SectionedItemTemplate.

Para uma boa experiência do usuário, recomendamos fornecer no máximo as 5 a 10 conversas mais recentes ou mais importantes, com não mais do que as 5 mensagens mais recentes para cada conversa. Isso ajuda a melhorar o desempenho do carregamento, permite que os usuários vejam o conteúdo mais relevante e reduz o tempo de interação.

class MyMessagingScreen() : Screen() {

    override fun onGetTemplate(): Template {
        val itemListBuilder = ItemList.Builder()
        val conversations: List<MyConversation> = // Retrieve conversations

        for (conversation: MyConversation in conversations) {
            val carMessages: List<CarMessage> = conversation.getMessages()
                .map { message ->
                    // CarMessage supports additional fields such as MIME type and URI,
                    // which you should set if available
                    CarMessage.Builder()
                        .setSender(message.sender)
                        .setBody(message.body)
                        .setReceivedTimeEpochMillis(message.receivedTimeEpochMillis)
                        .setRead(message.isRead)
                        .build()
                }

            itemListBuilder.addItem(
                ConversationItem.Builder()
                    .setConversationCallback { /* Implement your conversation callback logic here */ }
                    .setId(/* Set conversation ID */)
                    .setTitle(/* Set conversation title */)
                    .setIcon(/* Set conversation icon if available */)
                    .setMessages(carMessages)
                    /* When the sender of a CarMessage is equal to this Person,
                    message readout is adjusted to "you said" instead of "<person>
                    said" */
                    .setSelf(/* Set self-sender */)
                    .setGroupConversation(/* Set if the message contains more than 2 participants */)
                    .build()
            )
        }

        return ListTemplate.Builder()
            .setTitle("Conversations")
            .setHeaderAction(Action.APP_ICON)
            .setSingleList(itemListBuilder.build())
            .build()
    }
}

Cada ConversationItem mostra automaticamente ações para reproduzir uma mensagem e marcá-la como lida e para responder. Essas ações são processadas pelo ConversationCallbackDelegate fornecido ao criar o ConversationItem.

Se o app oferece atalhos de conversa, verifique se o ID fornecido ao criar o ConversationItem é o mesmo do ID do atalho dessa conversa.

Atualizar conversas

À medida que os usuários enviam e recebem mensagens, você precisa atualizar as telas do app para incluir as novas mensagens chamando invalidate(). Consulte Atualizar o conteúdo de um modelo.

Para a melhor experiência do usuário, recomendamos manter os tempos de atualização em 500 milissegundos ou menos. Se a atualização frequente demorar mais, você poderá mostrar um estado de carregamento enquanto carrega as mensagens recebidas.

Definir a importância da notificação de maneira adequada

Para reduzir as distrações, seu app precisa diminuir a importância das notificações recebidas quando um usuário está usando ou visualizando uma conversa correspondente para que as notificações não apareçam como notificações pop-up (HUNs, na sigla em inglês).

Você pode acompanhar se uma conversa está visível observando o ciclo de vida da Screen que a mostra. Consulte O ciclo de vida de uma tela.

Para impedir que uma notificação apareça como uma HUN, defina a prioridade como IMPORTANCE_DEFAULT ou menor.

Distribuir apps de mensagens baseados em modelo

Como os apps que oferecem suporte a experiências de mensagens baseadas em modelo só podem ser publicados nas faixas de teste interno e teste fechado no Google Play, não promova builds que incluam suporte para faixas de teste aberto ou produção, já que os envios que contêm builds nessas faixas serão rejeitados.