Android の Assist App 機能に対応する

# 概要
Android の Assist App (アシストアプリ)機能に対応させる方法について述べます。

# Assist App
端末のホームキーをロングタップすると、Google のアイコンが出てGoogle アプリが起動するかと思います。

![device-2018-06-24-191318.png](https://qiita-image-store.s3.amazonaws.com/0/102004/fac40313-7874-ab02-b3ff-4b8537853324.png)

この機能で起動するアプリは Assist App (アシストアプリ)というところで指定されていて、デフォルトのものから変更することが可能です。

## 設定の流れ
OSバージョンや端末ごとに設定方法が異なります。Android 6系の端末で試したところ、以下の通りでした。

![device-2018-06-24-185530.png](https://qiita-image-store.s3.amazonaws.com/0/102004/11757f53-ae9c-344c-fa78-d7ec115cb863.png)

まず、設定からアプリケーションマネージャを開きます。

![device-2018-06-24-185559.png](https://qiita-image-store.s3.amazonaws.com/0/102004/3c617403-61bc-05de-4bde-3b5a7bbb4d47.png)

アプリ一覧の右上にある歯車ボタンを押します。

![device-2018-06-24-185615.png](https://qiita-image-store.s3.amazonaws.com/0/102004/35d23d4c-d6cb-f34c-04c9-c5c4eeb4dac1.png)

Default Apps(既定のアプリ) を開きます。

![device-2018-06-24-185628.png](https://qiita-image-store.s3.amazonaws.com/0/102004/bc8e4807-140f-a37d-d7fa-daa7c4b1dd3f.png)

Assist & voice input (アシストと音声入力)を開きます。

![device-2018-06-24-185729.png](https://qiita-image-store.s3.amazonaws.com/0/102004/2e99a085-01f2-2081-e847-4d577e277b80.png)

Assist App に Google が設定されていますね。ここをタップすると

![device-2018-06-24-185804.png](https://qiita-image-store.s3.amazonaws.com/0/102004/635a7eb5-63fe-a27e-0685-77ea2fab7106.png)

Assist App に設定するアプリを選択可能です。どれかを選択すると

![device-2018-06-24-191418.png](https://qiita-image-store.s3.amazonaws.com/0/102004/700be1c2-1eeb-386f-7e88-3715e622012f.png)

許諾を得るダイアログが出ます。ここで AGREE を押してもらってようやく設定されます。このように、設定が非常に深いところにあるので、これをユーザに設定し直してもらうのは相当難しいかと思います。

なお、すべてのアプリを Assist App に設定できるわけではなく、特定の Intent Action に対応したアプリだけが選択肢に表示されます。その方法についてはこれから述べていきます。

# 実装

## AndroidManidest.xml での指定
対応自体は非常に簡単です。起動させる Activity に "android.intent.action.ASSIST" の intent-filter を追加するだけです。

```xml
<activity android:name=".MainActivity">

    <intent-filter>
        <action android:name="android.intent.action.ASSIST" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
```

これだけで Assist App の一覧に表示されるようになります。

## 分岐の追加
この Assist App 機能で起動された際に別の処理を入れたい場合、Intent.action が ```Intent.ACTION_ASSIST``` であるかを判定して、分岐を追加することができます。

```kotlin
if (TextUtils(Intent.ACTION_ASSIST, intent?.action)) { 
    //...
}
```

## アイコンを表示する
上記の修正により、ホームキーのロングタップで起動させられるようになりました(別途デフォルトアプリへの設定は必要です)。

![device-2018-06-24-193521.png](https://qiita-image-store.s3.amazonaws.com/0/102004/84f520b9-b244-e102-30f0-8cf24d20181f.png)

ですが、このまま動かすと白い丸が出るだけなので殺風景です。

### できるの？
ここにアイコンを入れるのは Google アプリだけの特権なのかと思ったのですが、

![device-2018-06-24-185937.png](https://qiita-image-store.s3.amazonaws.com/0/102004/c0cb7d2b-9be6-7e2c-5267-c7fb8375f904.png)

Yandex Browser ではちゃんと Y のアイコンを表示できているので、設定するやり方はあるようです。

### やり方
調べたら、meta-data で指定すればよいとわかりました。

```diff
<activity android:name=".MainActivity">

    <intent-filter>
        <action android:name="android.intent.action.ASSIST" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

+    <meta-data
+        android:name="com.android.systemui.action_assist_icon"
+        android:resource="@mipmap/ic_launcher"
+        />
```

![device-2018-06-24-193213.png](https://qiita-image-store.s3.amazonaws.com/0/102004/1509c351-e2de-9d2f-1bbe-ddc096d972e9.png)

できました。round アイコンの方がよかったかもしれません。

# 注意
Assist App 機能はホームキーのロングタップだけでアプリを起動してもらえるため、非常に強力な導線ですが、おいそれと使えるものではありません。

1. ユーザにデフォルトアプリの設定を変えてもらわなければならない……Google アプリから変える必然性はあるか、OS・端末ごとに設定手順が違う、等
2. この機能で起動されるアプリはユーザの行動を助けられる必要がある


自分たちのアプリがこの機能で起動させるのに適しているのかはよく考える必要があります。

# まとめ
Android の Assist App 機能は簡単に対応できて効果が高そうに見えますが、すべてのアプリに適した機能というわけではなく、よく検討した上で導入するか否かを決めた方が良いでしょう。

# 参考
- [Google Now Swipe Icon (Stack Overflow)](https://stackoverflow.com/questions/29717899/google-now-swipe-icon)