EmojiCompat の導入と問題とか

背景

DroidKaigi のセッションから気づき、アプリで実際試してみたところ
絵文字が化けて表示されてた(☐)ので直したい

解決方法としては EmojiCompat を使えば大丈夫とのことだった developer.android.com

以下は EmojiCompat を使おうとした時の問題と解決法

アプリのサイズでかくなる問題

EmojiCompatって emoji-appcompatemoji-bundled のどっちか両方かで使えるけど
最初、emoji-bundled を追加したらアプリのサイズが MB 単位で増えてしまったのでやめた(こっちは絵文字データ自体をアプリに入れて使う感じだった)
なので emoji-appcompat でアプリサイズ増やさずにダウンロードして使う方針で解決

初期化問題

EmojiCompatは 初期化(initialize)せずに使うとアプリが落ちるので要注意
使うたびに初期化定義する必要はないので Application クラスに定義しておくと全画面で EmojiCompat 使えるようになる
しかし java.lang.IllegalStateException: Not initialized yet というクラッシュが起きる場合があるので(epoxyの問題かも…謎)
使ってる箇所で try catch してあげないといけなくなってしまった…(これ用のクラス作って使うのが便利)

TextView や EditText の CustomView で使いたい問題

TextView や EditText の CustomView があり、そこに EmojiCompat を反映させたい時
TextView の場合は CustomView 内や外の setText してるところで EmojiCompat.get().process("表示される文字&絵文字") すればよし
EditText の場合は EmojiCompat 用 CustomView をもう一個作って(AppCompatEditText や EditText を継承)
それを自作の CustomView に継承させる感じ
EmojiCompat 用の CustomView は必要なコードがあってここを参考に作れる
developer.android.com

override した setKeyListener() と onCreateInputConnection() で EmojiEditTextHelper というのを使う必要があった

Android 8, 8.1 での ArrayIndexOutOfBoundsException 問題

元からこういう記事があり → http://nyanyoni.hateblo.jp/entry/2018/05/23/000000
まさに起きていたので(まだgoogleで直してなさそう)EditText で使う場合バージョンを指定しておく処理を入れないと行けなくなった
CustomView の場合はこんな感じ

init {
   if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O || Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
      this.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
   }
}

これでなんとなく EmojiCompat 対応はできるはず!

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

DroidKaigi 2019 に参加して来た!

前書き

DroidKaigiはエンジニアが主役のAndroidカンファレンスで
Android技術情報の共有とコミュニケーションを目的に2019年2月7日(木)、8日(金)の2日間開催します。

毎年一回行われていて、Androidチームみんなと参加して来ました!!
(もう一ヶ月前だけど)

私は DroidKaigi の受付スタッフとして参加していたので多くのセッションを聞くことはできなかったけれど
minne のアプリを作りながら共感できた二つのセッションの感想を述べようかなと思います。

マテリアルデザインの起源とベースとなる哲学

speakerdeck.com

まずは最近楽しく実装しているレイアウト関連!
minne の Andoird デザインは最近 Material Design ガイドラインに沿っているかどうかとか、minne のブランドがユーザーさんに届いているかどうかとか、
使いやすい UI/UX とは一体なんだ?!とか、エンジニアとデザイナーで勉強会や MTG を開いてよく議論にしています。

そこでこのセッションで話している「それが本当に重要か?そもそも誰が作ったのか」といったマテリアルデザインの起源とベースとなる哲学のことを私はそもそもよく知ってないと気づきました。
どんな意図で作られて、どんな意味を含んでいるのか?多様なユーザー価値と生産性のためにはどうすればいいのか?
その中一番しっくり共感できたのは「根源的に良い UI/UX(脳にやさしい心踊る体験)」でした。
リンゴを手から離すと落ちることは当たり前。ボタンの形をしているレイアウトを押したら押せるような反応をするのも当たり前。
今の minne のアプリもアニメーションといったユーザー体験を考慮していますが
もっと誰が使っても当たり前に受け入れられる脳にやさしい UI/UX にして行きたいと思うところでした。

Androidエンジニアが抑えておくべきUnicode Emojiの知識

speakerdeck.com

普段業務中で slack や android などでよく絵文字を使っているので気になっていたセッションでした。
(新たに 59絵文字が追加されたらしい)
よく自分の端末にある絵文字を相手に送ると、その相手は形の違う絵文字をもらったり、絵文字自体が四角とかで表示されない経験があり
minne の Android アプリにも作家さんとのやり取りのため、絵文字を使えるところあるけど大丈夫かな?!と思って試してみたら
悲しいことに同じ現象が起こっているのを見つけてしまいました…
でもこういう時は EmojiCompat を使い、Android OSのバージョンで依存しないようにすればいいらしい!!
ああ、このセッション見て本当よかったわー次回のリリースで修正しておこう…

後書き

すごい! DroidKaigi すごい(セッションの種類揃ってて量も多いし企業ブースも充実)!!
それとイベントが無事開かれ、終了するまで頑張ってたスタッフたちもすごい…!!
私はスタッフとしてできたことは大したことなかったけれど、
一緒に受付の道具作りやインカムでのやり取りと声がけなど、普段は全然しないだろう体験ができて楽しかった。
受付も去年と比べて QR コードの読み込みアプリとか、参加者が名札を自分で取れるようにしたフローとか、発展したという声が多くてやりがいがあった。
セッションの内容もまだまだ知らないことばかりで、まだまだ頑張れるという思いができ、たくさんのエネルギーをもらった2日間だった!!
また来年も今より成長した Android エンジニアとして参加します。