App Shortcutsを実装してみた

## App Shortcutsとは?
Android7.1で追加される、アプリのショートカットです。
iOSでいうクイックアクションみたいなものです。

## どのように使うのか?
iOSのクイックアクションはアプリのアイコンを強く押せば出てきますが、Androidには3D Touchがないのでタップの強弱を判別できません。
そのためAndroidではアプリのアイコンをロングタップで使えるようになっています。

![device-2016-10-20-132436.png](https://qiita-image-store.s3.amazonaws.com/0/126298/8cffef20-6992-583f-e2b1-1de643f5afb2.png)

## どのように実装するのか?
(SDKの導入に関しての説明は省かせていただきます)

### メインのActivityにApp Shortcutsを設定する

```xml:AndroidManifest.xml
    <application
        …(省略)…
        >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- App Shortcutsの設定 -->
            <meta-data android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />

        </activity>

        …(以下に別のActivityを追加)…

    </application>
```

`intent-filter`でホームにアイコンを表示するよう設定しているactivityに、App Shortcutsを表示するため`meta-data`を追加します。

### App Shortcutsの内容を設定する
res内にxml/shortcuts.xmlを追加します。

```xml:xml/shortcuts.xml
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:shortcutId="shortcut1"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/shortcut_short_label1"
        android:shortcutLongLabel="@string/shortcut_long_label1"
        android:shortcutDisabledMessage="@string/shortcut_disable_label1">

        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.numero.appshortcutsexample"
            android:targetClass="com.numero.appshortcutsexample.SubActivity" />

        <categories android:name="android.shortcut.conversation" />

    </shortcut>

    <shortcut
        android:shortcutId="shortcut2"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/shortcut_short_label2"
        android:shortcutLongLabel="@string/shortcut_long_label2"
        android:shortcutDisabledMessage="@string/shortcut_disable_label2">

        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.numero.appshortcutsexample"
            android:targetClass="com.numero.appshortcutsexample.SubActivity" />

        <categories android:name="android.shortcut.conversation" />

    </shortcut>

    <shortcut
        android:shortcutId="shortcut3"
        android:enabled="false"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/shortcut_short_label3"
        android:shortcutLongLabel="@string/shortcut_long_label3"
        android:shortcutDisabledMessage="@string/shortcut_disable_label3">

        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.numero.appshortcutsexample"
            android:targetClass="com.numero.appshortcutsexample.SubActivity" />

        <categories android:name="android.shortcut.conversation" />

    </shortcut>

</shortcuts>
```
shortcutのタグでid、icon、labelを設定し、呼び出したいactivityを設定したintentタグを囲むだけです。

上記の場合はこのような感じで表示されます。
![device-2016-10-20-140432.png](https://qiita-image-store.s3.amazonaws.com/0/126298/01542ff4-ff60-4be3-f54e-865c324d9bcb.png)

ショートカットはxml上で記述した順序とは逆の、下から上へ追加されていきます。
3つ目のショートカットが`android:enabled="false"`となっているので表示されていません。

### shortcutタグの説明
`android:enabled`
ショートカットの表示、非表示

`android:icon`
ショートカットのアイコン

`android:shortcutLongLabel`
ショートカット一覧のタイトル名

`android:shortcutShortLabel`
App Shortcutsより作成したショートカットのタイトル名
詳しくは後述参照

`android:shortcutDisabledMessage`
App Shortcutsより作成したショートカットが何らかの方法で`android:enabled="false"`となった場合に出てくるメッセージ
詳しくは後述参照


## App Shortcutsからショートカットの作成
ショートカット右に二重線のアイコンですが、App Shortcutsからショートカットアイコンを作成できるようになっています。
二重線のアイコンをドラッグすると、ホーム画面にショートカットを設置することができます。
LongLabel2のショートカットを作成すると以下のようになります。
![device-2016-10-20-142113.png](https://qiita-image-store.s3.amazonaws.com/0/126298/89d0cc82-8577-ef53-fd7b-ead4f760a03e.png)


先程の`android:shortcutShortLabel`はこのときのタイトル名となっています。
左のMapsを見てもらうとわかりますが、ここで作成されるショートカットのアイコンは`android:icon`で指定したもの+右下にアプリのアイコンになります。

このショートカットを作成した状態で`android:enabled="false"`とすれば
![device-2016-10-20-174732.png](https://qiita-image-store.s3.amazonaws.com/0/126298/ead35a79-6475-ce4d-4e3b-f706c0e2ea57.png)

このようにアイコンが白くなり、タップすると`android:shortcutDisabledMessage`で指定した文字が表示されます。


## 補足
今回Android Studio2.1.3で試してみたのですが、shortcutタグの`android:shortcutShortLabel`などで直接文字を打ち込むとビルドエラーがでました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/126298/b6ae63a3-baba-eb73-90cb-90030b21dc0f.png)

変更があるかもしれませんが、labelの文字列はres/strings.xmlに記述しましょう。

## 参考
[https://developer.android.com/preview/shortcuts.html](https://developer.android.com/preview/shortcuts.html)