Pepper SDK入門(24) TopicとTopicStatusでTopicファイルをまな板の鯉化する

# ¿What is Topic❓
今回の記事で取り扱うTopicとは、QiChatbotのための会話内容が記述されているものです。
ユーザとPepper間の言葉によるやりとりを定義しています。

# TopicにはStatusがある
Qichatbotは複数のTopicでビルドできます。ファウルズの話[^1]についてのTopic、スキージャンプ・ペアの話についてのTopicなどです。
ファウルズの話をしている時はファウルズのTopicにフォーカスが当たっており、スキージャンプ・ペアの話をしている時はスキージャンプ・ペアのTopicにフォーカスが当たっています。フォーカスされているTopicは基本的に、最後の応答を返したTopicです。getFocusで、今フォーカスされているTopicを取得することもできます。
[^1]: ここでは円城塔の『オブ・ザ・ベースボール』に登場する、人が降ってくる町の意。バットで落ちてくる人を打ち返します。

TopicStatusは、そうしたTopicファイルの有効・無効を設定できる値クラスです。

```
fouls.top
u:(野球) 野球最高！！
```

```
ski_jumping_pairs.top
u:(スキージャンプペア) トライアングルできるかな
```

通常上二つのTopicファイルでQichatbotをビルドしてChatさせると、ユーザが「野球」と言えばPepperは「野球最高！！」と返し、「スキージャンプペア」と言えば「トライアングルできるかな」と返します。
しかしTopicStatusでファウルズのTopicファイルを無効(false)にすると、ユーザが「野球」と言っても「野球最高！！」を返さなくなるのです。
一度無効にしたTopicファイルを有効にしたい時には、setEnabledで有効(true)を設定しましょう。

# 🎡🧪🎨<font color="Crimson">利</font><font color="DarkOrange">用</font><font color="Yellow">法</font><font color="LightGreen">い</font><font color="CornflowerBlue">ろ</font><font color="MediumBlue">い</font><font color="BlueViolet">ろ</font>🌈🧫💫
## 1.QiChatbotをビルドする
TopicファイルからTopicをビルドし、QiChatbotを作成します。
QiChatbotについては[前回の記事](https://qiita.com/kskrin/items/ef9290e0393ebb00316b)も参考にしてください。

```java
//Topicを作成
Topic baseballtopic = TopicBuilder.with(qiContext)// QiContextを利用してビルダーを作成
                          .withResource(R.raw.fouls)//Topicファイルを設定
                          .build();//Topicをビルド
Topic skiTopic = TopicBuilder.with(qiContext)
                     .withResource(R.raw.ski_jumping_pairs)
                     .build();

QiChatbot qiChatbot = QiChatbotBuilder.with(qiContext)
            .withTopic(topic)
            .build();
```
## 2.Topic、Getだぜ🐭⚡️
QiChatbotに含まれる全てのTopicを取得します。

```java
List<Topic> topics = qiChatbot.getTopics();
```

##3.TopicStatusを管理(≠全展望監視)する
TopicからTopicStatusを作成します。パノプティコンは作りません。

```java

baseballTopicStatus = qiChatbot.topicStatus(baseballtopic);
skiTopicStatus = qiChatbot.topicStatus(skiTopic);

//該当のTopicファイルを無効にする
baseballTopicStatus.setEnabled(false);
//現在のTopicファイルの状態を知りたい時に呼ぶ
Boolean isEnabled = baseballTopicStatus.getEnabled();
baseballTopicStatus.addOnEnabledChangedListener(enabled ->
     //Topicファイルの状態が変わった時に呼ばれる
     Log.i(TAG, "onEnabledChanged: " + enabled)//UFOの着陸音を流しても可
);
//現在のフォーカスの状態を知りたいときに呼ぶ
Boolean isFocused = baseballTopicStatus.getFocused();
baseballTopicStatus.addOnFocusedChangedListener(focused -> 
     //フォーカスの状態が変わった時に呼ばれる
     Log.i(TAG, "onFocusedChanged: " + focused)//ネッシーの画像を表示しても可
);
```
上のコードの場合はファウルズのTopicが無効なため、ユーザが「野球」と言ってもPepperは反応しません。
globalRecommendationsでユーザの発話候補を取得すると、ファウルズのTopicから「野球」を取得することはできませんが、スキージャンプ・ペアのTopicから「スキージャンプペア」を取得することはできます。
Recommendationsについては[前回](https://qiita.com/kskrin/items/ef9290e0393ebb00316b#recommendations%E3%81%AE%E5%8F%96%E5%BE%97)を復習してみてくださいね📖🔍


# あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/topic_topicstatus.html)を参考に書かせていただきました。
さらに詳しくは[TopicのAPIリファレンス](https://android.aldebaran.com/sdk/doc/javadoc/qisdk/com.aldebaran.qi.sdk.object.conversation/-topic/index.html)や[TopicStatusのAPIリファレンス](https://android.aldebaran.com/sdk/doc/javadoc/qisdk/com.aldebaran.qi.sdk.object.conversation/-topic-status/index.html)を参照してください。

次回はQiChatVariableの回です。Variable Star(変光星)🌟とVariable Wind(変向風)🌬の登場はありません。$\{\mathbb{See you later alligator ～}}$🐊