Android Car App Library 1.4.0-alpha01 が登場しました

🎉 面白いものがないかを見てみましょう。
developer.android.com

Adds top-level actions to GridTemplate in Car App Library (Id0191) && Adds top-level actions to ListTemplate in Car App Library (I9efab)

GridTemplateListTemplatetop-level actionsを表示できるようになりました。

top-level actions って言われても意味不明だったのですが、FloatingActionButton として、ボタンを表示できるようになるようです。

GridTemplate.Builder  |  Android Developers


こういう感じに指定できます。

ListTemplate.Builder()
            ...
            .addAction(
                Action.Builder()
                    .setEnabled(true)
                    .setIcon(CarIcon.APP_ICON)
                    .setBackgroundColor(CarColor.PRIMARY)
                    .setOnClickListener { }
                    .build()
            )
            ...

ただ現時点では特に何も表示されないし、デザインガイドラインにも FAB についての記述は見当たらないため、今後のリリースによって表示されるようになる気がします。

メディアアプリにて表示している View にて、アルバム名からアルバムに遷移、アーティスト名からアーティストに遷移できる紐付けが提供されるようです。まだ試してないのでわかりませんが、これできなくて不便に感じている人多いと思うので嬉しいですね。

developer.android.com

Add messaging callbacks to A4C (Ie3986)

これは一体何を言っているのでしょうか?ぱっと見では意味不明でした...
callbacks ということで追加されたコードを見てみると、このような interface があります。

/** Host -> Client callbacks for a {@link ConversationItem} */
@ExperimentalCarApi
@CarProtocol
public interface ConversationCallback {
    /**
     * Notifies the app that it should mark all messages in the current conversation as read
     */
    void onMarkAsRead();

    /**
     * Notifies the app that it should send a reply to a given conversation
     */
    void onTextReply(@NonNull String replyText);
}

conversation(会話)????一体何のことを言っているのでしょうか?これについては、API Level 6 で使用可能なConversationItemクラスを理解する必要があります。

ConversationItem クラスとは何か?

リリースノートには一切記述されていないため気がついていない人が大多数だと思いますが、去年の段階でConversationItem というものが追加されています。
developer.android.com

ドキュメントの説明を見ても簡単すぎていまいちわかりにくいですね。conversation ということで会話を表していそうですが、どういうことでしょうか?

ConversationItem は Grid表示や List表示に使われる interface Item を実装しています。
Item  |  Android Developers

このことから、グリッドやリストに表示するクラスであることがわかります。

次に、ConversationItem は内部に CarMessage を保持します。
developer.android.com

getBody()CarText を取得できますが、これはメッセージと書かれています。getSender() でメッセージを送信した人を取得できるようです。getRead()で「既読かどうか?」の真偽値が返ってきます。このことから、送信されてきたメッセージを表すクラスであろうということがわかります。つまり CarMessage を内部にもつ ConversationItem はどうやらメッセージアプリのリスト or グリッド表示で使用されるようだということがわかります。


試しに ConversationItem をリストに表示してみましょうか。実行時にエラーにならない程度にセットするデータを絞って、可能な限り行数を減らしたコードです。今回追加されている ConversationCallbackインスタンスも登場しています。

...
val itemList = ItemList.Builder()
            .addItem(
                ConversationItem.Builder()
                    .setId("id")
                    .setTitle(CarText.create("title"))
                    .setMessages(listOf(CarMessage.Builder()
                        .setSender(Person.Builder()
                            .setName("name")
                            .build())
                        .setBody(CarText.create("こんにちは。今日の天気はいかがでしょう?"))
                        .build()))
                    .setConversationCallback(object : ConversationCallback {
                        override fun onMarkAsRead() {
                            // do nothing
                        }

                        override fun onTextReply(replyText: String) {
                            // do nothing
                        }
                    })
                    .build()
            )
            .build()

        return ListTemplate.Builder()
            .setSingleList(
                itemList
            )
...

これを実行するとどうなるでしょうか?

リストの項目が表示されています。このリストを選択するとどうなるでしょう?


なんといきなり Google アシスタントが起動し、以下のように話しかけてきます。

Googleアシスタント「こんにちは。今日の天気はいかがでしょう?返信しますか?」
そして返答待ちになります。ここで「はい」というと

Googleアシスタント「はい、メッセージをお願いします。」
となり、メッセージの入力を求められます。このあとは以下のように流れていきます。

人間「こんにちは。こちらは晴れです。早く暖かくなってほしいですね。」

Googleアシスタント「次のメッセージを送信します。こんにちは。こちらは晴れです。早く暖かくなってほしいですね。」

Googleアシスタント「送信しますか?変更しますか?」

人間「送信します」

Googleアシスタント「送信しました。メッセージは以上です。」

つまり、ConversationItem は送られてきたメッセージを「音声で読み上げ、音声入力で返信可能な項目」としてリストに表示し、選択された場合は Google アシスタントによって返信できる機能を提供する、というものであるということがわかりました。だから「会話」なんですね。

メッセージを読み上げたら ConversationCallbackonMarkAsRead が呼ばれ、既読処理をするべきだということがわかるようになっています。onTextReplyGoogleアシスタント「送信しました。メッセージは以上です。」が読み上げられた時点で呼ばれます。ここで返信処理を書く、ということになります(アシスタントが勝手に送ってくれるわけではない)。

おもしろポイントまとめ

  • GridTemplateListTemplate には FAB らしきボタンがつくみたいです
  • リストに表示されたメッセージ項目に対し、ユーザがGoogle アシスタントと会話することで返信できる機能が用意されています