Android 7.1 の新機能 App Shortcuts を使ってみる

こんばんは、SNS mixiのAndroidアプリを書いているAKKUMAです。
今年は**Android 7.1**で追加された、ショートカットメニューを表示するAPIである**App Shortcuts**を使ってみた話について書きます。

# App Shortcuts

https://developer.android.com/guide/topics/ui/shortcuts.html

**Android 7.1**(SDK 25)で追加された、ランチャー上のアプリアイコンを長押しすると出る**ショートカットメニュー**の機能です。
タップすることで特定のIntentを起動できるようです。メニュー右端の＝アイコンをドラッグすることでショートカットをアイコン化をすることもできみたいです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/75828/d3bcfc3c-1ee6-5502-3d5c-9d55ca9c8711.png" width="400px"/>

# 使ってみる

ショートカットの種類が2つあり、**Static Shortcuts** と **Dynamic Shortcuts** に分かれているようです。
Static Short は xml 上で定義する**静的な**ショートカットメニューを定義します。
Dynamic Shortcuts は ShortcutManager を利用し、**動的に**ショートカットメニューを設定します。

## SDK Level

まずは `compileSdkVersion` を **25** に設定する必要があります。

```groovy:build.gradle

android {
    compileSdkVersion 25
}

```

## Static Shortcuts

**xml**を利用し**静的**なショートカットメニューを定義してみます。
`res/xml/shortcuts.xml`に配置します。**values**ではないので注意。

`android:icon` にアイコンを指定、`android:shortcutShortLabel`等に文字列を指定できます。
文字列はこのxml内には直接書けないので`res/values/strings.xml`に定義しましょう。

`intent`タグ内でタップ時に発動するIntentを定義できます。

```xml:res/xml/shortcuts.xml
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:shortcutId="hoge"
        android:enabled="true"
        android:icon="@drawable/ic_motorcycle_black_24dp"
        android:shortcutShortLabel="@string/shortcut_short_label"
        android:shortcutLongLabel="@string/shortcut_long_label"
        android:shortcutDisabledMessage="@string/shortcut_disabled_message">

        <intent
            android:action="info.akkuma.appshortcutssample.action.HOGE"
            android:targetPackage="info.akkuma.appshortcutssample"
            android:targetClass="info.akkuma.appshortcutssample.MainActivity" />

    </shortcut>
</shortcuts>
```

次に `AndroidManifest.xml` 上に先程の`shortcuts.xml`を登録します。
ランチャーに表示できないActivityに入れてもしょうがないので
`<category android:name="android.intent.category.LAUNCHER" />` が付いているActivityに入れましょう。


```xml:AndroidManifest.xml
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

    <meta-data android:name="android.app.shortcuts"
        android:resource="@xml/shortcuts" />

</activity>
```

これだけでショートカットメニューができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/75828/3e07eae8-88e6-91dd-c317-36ea79c06014.png" width="400px" />

## Dynamic Shortcuts

次は**ShortcutManager**を利用し**動的**にメニューを追加してみます。

`ShortcutManager`を利用してショートカットメニューを設定したり追加したりします。
ショートカット内容は`ShortcutInfo`を使い作成しますが、**Intent**には**Action**を指定しないと例外が`throw`されるので要注意です。
また、**最大数を超えるショートカットメニューを追加**しようとした時も`throw`されます。ショートカットは**合計4つ以下**でなければならないようです。
既にある**同一ID**のショートカットメニューを追加した場合は、**無視**されるようです。

```java

ShortcutManager manager = (ShortcutManager) context.getSystemService(SHORTCUT_SERVICE);

int shortcutCount = manager.getDynamicShortcuts().size();

Intent intent = new Intent(Intent.ACTION_VIEW, null, this, MainActivity.class);

ShortcutInfo info = new ShortcutInfo.Builder(context, "fuga" + shortcutCount)
        .setShortLabel("LGTM " + shortcutCount)
        .setIcon(Icon.createWithResource(context, R.drawable.ic_thumb_up_black_24dp))
        .setIntent(intent)
        .build();

manager.addDynamicShortcuts(Collections.singletonList(info));
```



<img src="https://qiita-image-store.s3.amazonaws.com/0/75828/bee800f7-a405-40c5-9886-8ecdbb7285c2.png" width="400px"/>