Shortcuts の Icon が vectorDrawable で、色を変えたい時

使っている resources が vectorDrawable であり Shortcuts の Icon としてセットできるけど色を変えたい場合、Shortcuts の Icon では tints が使えない。

方法の一個として drawable の setColorFilter で色を変え、bitmap に変換してセットする

// bitmap に変換して Icon で返してくれ君
@RequiresApi(Build.VERSION_CODES.N_MR1)
fun createIcon(activity: Activity, drawableId: Int): Icon {
        val changeDrawable = ContextCompat.getDrawable(activity, drawableId)
        changeDrawable?.setColorFilter(
            ContextCompat.getColor(activity, R.color.change_color),
            PorterDuff.Mode.SRC_IN
        )

        var bitmap: Bitmap? = null
        changeDrawable?.let {
            val newBitmap = Bitmap.createBitmap(it.intrinsicWidth, it.intrinsicHeight, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(newBitmap)
            it.setBounds(0, 0, canvas.width, canvas.height)
            it.draw(canvas)
            bitmap = newBitmap
        }

        return if (bitmap == null) {
            Icon.createWithResource(activity, drawableId)
        } else {
            Icon.createWithBitmap(bitmap)
        }
}
// 使う側
val shortcut = ShortcutInfo.Builder(activity, "shortcut_id")
                    .setShortLabel("label")
                    .setIcon(createIcon(activity, R.drawable.ic_shortcut))
                    .setIntent(hogeIntent)
                
val shortcutManager = activity.getSystemService<ShortcutManager>(ShortcutManager::class.java)
shortcutManager.dynamicShortcuts = Arrays.asList(shortcut.build())

ドキュメント https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts#attribute-values