DroidKaigi 2024参加レポート

# はじめに
9/11(水)〜13(金)に行われたDroidKaigiに参加した。
2023年に初参加して以来2回目の参加。
熱の冷めないうちに、セッションで印象に残った内容や感想をまとめておく。

# 印象に残ったセッション
## [The real case of offline-first app: Farmer App in Ghana](https://youtu.be/-G3S5RJN8qs?si=Ffgk18iF46u45d_b)
システムデザインインタビューの対策を見ると、高確率でネットワーク速度について言及されているので、実際にどういう対策があり得るのか知れてよかった。

- 画像がオフラインだと取得できない
    - WorkManagerを使ってリクエストをキューに追加
    - オンラインになったら取得
    - Coilでキャッシュしておきオフライン時に使う
- 位置情報がオフラインだと取得できない
    - 一般に推奨されているFusedLocationProviderだと、GPS以外にもWi-fiやcellular networkも使って位置情報を取得する
        - 屋内でもより正確な位置情報を取得できるというメリットがあるけど、ネットワーク環境が弱いと逆に不正確になってしまう
        - GPSだけを使うというオプションはない
            - PRIORIY_HIGH_ACCURACYを指定してもGPSの"優先度が上がる"だけ
    - LocationManagerはGPS_PROVIDERを指定することで、GPSだけを使うことを指定できる
- Google mapのPolyLineがオフラインだと表示できない
    - 一度地図をオンラインで表示していると、その後オフラインになってもPolyLineだけは表示できる
        - この仕様について公式に言及はされていない
        - サインイン時は必ずオンラインにさせるので、その時に知事も表示させるようにした

GPSのように実地環境が絡む機能については、早い段階で実地検証しておくのが大事。

Android developersの[オフラインファースト アプリの作成](https://developer.android.com/topic/architecture/data-layer/offline-first?hl=ja)については読もう読もうと思ってずっと積んでいたのでこれを機に読んでみる。

## [You will Becoming a fullstack developer with your Android skills](https://youtu.be/6gr2hJJNZAc?si=fgheKDJWRndIKNiV)
前半は基本的なKMPの話。
後半のノートブックの話が特に興味深かった。

Kotlinノートブックがあるのは知ってたけど、拡張子がipynbのままで動くとは思わなかった。
しかもGitHubにPushすると、コードブロックも実行結果も表示されるとは。これはデータサイエンスに限らず活用できる場がありそう。

## [海外就職というキャリアの考え方](https://youtu.be/KP3oHy6zwLM?si=8FB-3N1-VqxdhN0_)
少し異色のセッション。Androidエンジニア以外にも海外就職に興味のある人全般に有用なセッションだった。

現状日本の仕事に満足できていないなら、海外は良い選択肢。
満足できているなら無理に行く必要はない。

個人的には言葉の壁は問題ないけど、人脈全部再構築やパートナーや子供の生活を考えると少し厳しいなと思った。

ただ、同じ仕事でも日本の給与レンジが700~1100万円なのに対して、シンガポールだと1300~3560万円になるのは夢がある。

## [デザインからアプリ実装まで一貫したデザインシステムを構築するベストプラクティス](https://youtu.be/7Jj48h35XEg?si=tgWIZQReRhagJ73o)
デザインとアプリ実装の一貫性には苦しめられがちなので、他の人がどうしてるか知りたくて聴講した。

「ペライチ画像を作るのがUIデザインではない」←これは本当にそうで、ペライチ渡されてこれがあれば実装できるでしょ？って言われると「いや、無理です・・・」ってなるので開発に携わる人全員にこのスライドは見せたい。

- 仕様書とデザインデータ(Figma)の使い分け
  - デザインデータ：ヴィジュアルを示す
  - 仕様書：ビジネスロジックの実装に必要な情報を示す

この辺普段の会話だとごっちゃになりがちだけど、意識してちゃんと使い分けたい。

- FigmaのComponentsはComposableの単位と一致させる
- variantsでUIのパターン(同じ役割だけど見た目が違うもの)を表す

Figmaを見る時に、このあたりがちゃんと意識して作られているかをレビューすればよさそう。
発表でも言ってたけど、UI設計の段階からデザイナーと協業して、早い段階で意識合わせをしていきたい。

## [A new era of testing](https://youtu.be/nJFWO8sgaBA?si=muh5r49vxSYAnq6K)
Android用のJUnit5フレームワーク作成者のmannodermaus氏による発表。ひそかに尊敬していたエンジニアを間近で見られて良かった。

- @MethodSource, @FieldSource, @CsvSourceといったアノテーションでパラメタライズドテストに渡す引数をメソッド、フィールド、CSV文字列から渡すことができる
- @Enabled~や@Disabled~といったアノテーションで、それぞれの条件(ローカル/CI, DEBUG/RELEASE, SDKバージョン26以上等)の場合のみ実行することができる

JUnit5は普段使っているけど、全然強みを引き出せていなかったなと感じた。

まだExperimentalで基本的なケースでしか動かないけど、JUnit5でRobolectricを動かせられる[apter-tech/junit5-robolectric-extension](https://github.com/apter-tech/junit5-robolectric-extension)というのがあるとのこと。

JUnit5でRobolectricをサポートする件について、"Nobody is crazy enough to attempt to make it work."とそれに続く"Balázs is crazy enough"は現地で聞いてて笑った。
Robolectricの中身を見たり仕組みを調べたことがある人は、いかにBalázs氏がcrazyか共感できると思う。

- 2024年の推奨テスト環境
    - ユニットテスト
        - Robolectric, Espresso, ComposeにはJUnit4
        - それ以外はJUnit5
    - Instrumentation テスト
        - minSdk < 26
            - JUnit4 + Junit5
        - minSdk >= 26
            - JUnit5

## [Composeのタッチイベントの仕組みを理解してジェスチャーを使いこなそう](https://youtu.be/vWkbeEKhfjE?si=GeqkW6bTfSfPQC1L)
- Composeには2種類のジェスチャーAPIがある
    - Modifier.~able(clickable, draggableなど)
        - エフェクト、トークバックあり
    - detect~Gestures(detectTapGestures, detectDragGesturesなど)
        - ジェスチャー検出のみ
        - ~able系より詳細な情報を取れる（座標など）
- デフォルトのAPIでできないジェスチャーは自作する
    - PointerInputChangeとPointerEventを活用
- イベントは子要素から親に伝達される
    - 両方でイベントを処理すると競合してしまうので、子の方で明示的にconsume()で消費し、親の方ではisConsumedを参照して消費されていたら実行しないということが必要
- イベント伝達パスは3つある(Initial, Main, Final)
    - Initial：親が先に消費して、子のイベントを抑制できる
    - Main：実際の処理
    - Final：親がイベントを消費したことを検知して、子のイベントを途中でキャンセルできる

ひとくちにタッチイベントと言っても、なかなか奥の深い世界であることが分かった。
consumeの考え方や伝達パスの存在を知ることができたのは大きい。今後イベントの競合が発生したら、まず最初にこの発表資料を参照したい。


## [Creative UIs with Compose](https://youtu.be/eWDthP0oUKc?si=eAdyeiK91aXpPzQm)
個人的MVPセッション。
ペルソナ5のチャットアプリ(↓これ)をComposeで再現するという試み。
こういうすぐには役に立たないけど、知的好奇心をくすぐられる発表が好き。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287959/ccb25339-fb9b-bb46-29da-06e32d4507ba.png" width="300">
バックグラウンドやアニメーションが徐々に完成形に近づいていくのはワクワクさせられた。
白背景 + 黒背景の上にテキストを置き、かつテキストの長さによって背景を伸び縮みさせる、アバターとテキストボックスの間の吹き出し口、アバターを繋ぐ黒いジグザグの線、等々Composeで再現するための工夫を色々見られて楽しかった。

今は猫も杓子もフラットデザインなので、こういった尖ったデザインを採用したアプリがもっと世に出れば良いのになと思う。

# DroidKaigiアプリコントリビュート
今年は10個弱PRを出すことができた。
難易度の高いissueにも挑戦してawsomeラベルも頂くことができた。

3日目にtakahiromさんと直接話すことができて、その中でコードの品質を褒めていただいたのはいまだに嬉しい。
DroidKaigiアプリは色んなAndroidエンジニアの参考になるものだし、出来るだけ良いコードになるように意識してたので、頑張った甲斐があった。

issueを解くのは謎解きみたいで楽しいので、今後もDroidKaigiアプリに限らずOSSには貢献していきたい。

# まとめ
今年も楽しい祭りだった。

今年の特徴として、セッションの動画が上がるのが爆速なので、熱の冷めないうちに復習できたり、聞きたかったけど時間が被ってて聞けなかったものがすぐに聞けるのも助かる。

ここまで滞りなく運営するのは大変だと思いますが、運営していただいている方々には感謝しかないです。ありがとうございます。