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

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

Além da experiência básica de mensagens com notificações para leitura e resposta a mensagens, o Android Auto oferece experiências de mensagens mais avançadas criadas com a biblioteca Android for Cars App.

Suporte a experiências de mensagens com notificações

Todos os apps que oferecem suporte a experiências de mensagens baseadas em modelos também precisam estender as notificações de mensagens para o Android Auto. Com essa integração, os usuários podem ler e responder mensagens sem precisar abrir o app com modelo.

Criar uma experiência de mensagens com modelo

Siga as orientações em Usar a biblioteca Android for Cars 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 dos apps de mensagens com modelos.

Configurar os arquivos de manifesto do app

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

Declarar suporte à categoria no manifesto

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

<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 Car App

Como a API ConversationItem só é compatível com a API Car 7 ou mais recente, defina os metadados minCarApiLevel com 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 do 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, exiba uma lista de objetos ConversationItem 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 importantes, com não mais que as 5 mensagens mais recentes de cada conversa. Isso ajuda a melhorar o desempenho de 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 tocar 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 fornecer atalhos de conversa, verifique se o ID fornecido ao criar o ConversationItem é o mesmo do atalho dessa conversa.

Atualizar conversas

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

Para garantir 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, mostre um estado de carregamento enquanto carrega as mensagens recebidas.

Definir a importância da notificação adequadamente

Para reduzir as distrações, o 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 de alerta (HUNs, na sigla em inglês).

Para saber se uma conversa está visível, observe o ciclo de vida do Screen que a mostra. Consulte O ciclo de vida de uma tela.

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

Distribuir apps de mensagens com modelos

Como os apps que oferecem suporte a experiências de mensagens com modelos só podem ser publicados nas faixas de teste interno e teste fechado do Google Play, não promova versões que incluam suporte a faixas de teste aberto ou produção, já que envios que contenham versões nessas faixas serão rejeitados.