Infinito Nirone 7

白羽の矢を刺すスタイル

MediaSessionManager を使って現在 active な MediaController を取得したい

MediaSessionManager は端末上で有効な media session を提供するクラスです。通常のアプリであれば、NotificationListenerService と組み合わせて現状どの media session が端末上で動いているかを取得する目的で使います。 端末上で動いている media sessi…

2026 をやっていく

2025 年を振り返り忘れたまま 2026 年になってしまったので、とりあえず 2026 年をやっていく記事を書いておきます。 バイクの大型免許を取る 自分の体格ではそもそもバイクの選択肢が少なく、780mm のようなごく標準的なシート高がギリギリ許容範囲の上限い…

kotlinx.datetime 0.7.x へのバージョンアップと DayOfWeek

DayOfWeek は曜日を示す列挙型で、月曜日を起点として順序付けの整数(1から7まで)を持っています*1。Java の実装は java.time.DayOfWeek で、Kotlin では kotlinx.datetime.DayOfWeek です。 kotlinx.datetime 自体は DateTime 専用のライブラリとして提供…

渋峠

バイクの納車から早いものでもう5ヶ月、気がつけばODOメーターは6000kmを優に超えている。明らかに乗り過ぎである。 そんなこんなでアクションカメラも揃えつつあり、ちょくちょく YouTube に動画も上げている。 www.youtube.com www.youtube.com www.youtub…

AndroidX Room でインデックスの手動マイグレーションを実装する

テーブルに張ったインデックスの制約が変わったときなど、手動マイグレーションをするときは次のようにマイグレーションを実装する。 同じカラムを持つ新しい別のテーブルを用意する 元のテーブルから新しいテーブルにデータを移し替える 元のテーブルをドロ…

AndroidX Room の Migration では自前でトランザクションを開始しなくてよい

developer.android.com ドキュメントにある通り、Room 側でトランザクションを開始してくれているので、自前で Migration を実装するときに改めてトランザクションを開始しなくてもよい。むしろ自分でトランザクションを開始・終了してしまうと無限に Migrat…

バイク納車の儀

これまで散々レンタカーやカーシェアでいろいろな車を異常な距離で乗り回し、いつかどこかで車をなどとふわっとしたことを考えていた中、気がついたらバイクを買っていた。 今年の10月に普通自動二輪免許を取得したが、免許取得中は「この重たくて危ない乗り…

マルチプロセスに対応した DataStore とプロセス間の排他制御

androidx.datastore の DataStore はデータを非同期にストレージへ読み書きするためのフレームワークです。 DataStore は 1 つのファイルに対しデータの読み書きを実行するので、同一のプロセス内では必ず DataStore のインスタンスは 1 つ(シングルトン)…

WorkManager で定期実行する Work の最短インターバルは 15 分

よく忘れるのでタイトルに書いたルールがあることをここに残しておく

サウナにハマるきっかけになった温泉:箱根湯寮

この記事は「サウナAdvent Calendar 2023」の12日目の記事です。 adventar.org 箱根湯寮 箱根湯寮とは箱根湯本にある温泉です。 www.hakoneyuryo.jp 箱根湯本駅からも割りと近いのですが、激坂を登った先にあるため駅からシャトルバスで行くことをおすすめし…

Jetpack Compose TextField の横幅を n 文字分だけ確保したい

View の仕組みでは、 TextView のプロパティとして ems が定義してあり、これを利用するとTextView の横幅を ems で指定した文字数分の横幅にしてくれます。 R.attr | Android Developers Jetpack Compose では Text や TextField にそのものズバリな引数や …

近況2023

この記事は「mhidakaが2つ目を建立したAdvent Calendar 2023」の10日目の記事です。近況を報告せよとのことだったので、なんとなく今年のハイライト的な記事を書いておきます。 adventar.org 今年たのしかったこと 桜のAACR AACRとは長野県の安曇野市周辺で…

WorkManager Migration to 2.9.0

AndroidX WorkManager の 2.9.0 がリリースされました。以前のバージョンからこのバージョンに上げるにはマイグレーションが必要です。 https://developer.android.com/jetpack/androidx/releases/work?hl=en#2.9.0 Configuration.Provider の実装 2.8.x 以…

DEEDS BREWING #BeerAdventCalendar2022

この記事は Beer Advent Calendar 2022 - Adventar の 9 日目の記事です。 これがうめぇんだ! DEEDS XPA しっかりとした苦味がありつつ、後味スッキリですいすい飲めます。 最高です。 DEEDS DOUBLE TIME さっきの XPA の苦味と後味にくわえ、HAZY PALE ら…

DEEDS BREWING #BeerAdventCalendar2022

この記事は Beer Advent Calendar 2022 - Adventar の 9 日目の記事です。 これがうめぇんだ! DEEDS XPA しっかりとした苦味がありつつ、後味スッキリですいすい飲めます。 最高です。 DEEDS DOUBLE TIME さっきの XPA の苦味と後味にくわえ、HAZY PALE ら…

多くのパラメータを持つ関数・コンストラクタの呼び出しに必要な引数を名前付きで自動生成したい

やりたいこと 次のように定義されたコンストラクタを名前付き引数を使って呼び出したい。 // 定義 data class Sample( val hoge: String, val fuga: String, val moga: String, val piyo: String, val foo: String, val bar: String, val baz: String, val q…

つけ麺 えん寺 #つけ麺AdventCalendar2022

この記事は つけ麺 Advent Calendar 2022 - Adventar の4日目の記事です つけ麺 えん寺 ベジポタつけ麺肉増し味たま付き これがうめぇんだ! 説明 ベジポタつけ麺をやっているお店です。 吉祥寺・中野・池袋・東高円寺に「えん寺」がある他、野方に「花みず…

BottomSheetScaffold の sheetContent を空にしてはいけない

BottomSheetScaffold を使って BottomSheet を作るとき、BottomSheet の中身は BottomSheetScaffold の引数にある sheetContent で作っていきます。 developer.android.com BottomSheetScaffold( sheetContent = { /* BottomSheet の中身 */ } ) { paddingVa…

Jetpack Compose 1.2.0 では Scaffold の content に PaddingValues を必ず設定する

Jetpack Compose 1.2.0 (正確には Jetpack Compose 1.2.0-alpha07 以後) から Scaffold の content で Scaffold から渡される PaddingValues を使わないと Lint エラーとなります。 developer.android.com Lint で指摘される例 次の例は Lint のエラーとなり…

DroidKaigi: Weekend Chat の配信を支える構成

Mac を利用した Discord と OBS による YouTube Live 配信環境 DroidKaigi: Weekend Chat は Mac 上で Discord をつないで @mhidaka さんと話しているのを OBS に流して YouTube Live 配信にのせています。 Loopback Windows であれば音声キャプチャはそれほ…

CircleCI で Android アプリプロジェクトのビルドに利用する Docker Image が変わったので更新する

次のような記述で Android 用の Docker Image を利用すると、ジョブのステータスを表示する画面で You’re using a deprecated Docker convenience image. Upgrade to a next-gen Docker convenience image. といったメッセージが表示されます。 executors: a…

Jetpack Compose で GridLayout を実現する

Jetpack Compose には LazyVerticalGrid というグリッド表示をしてくれる Composable がありますが、LazyColumn など他のスクロール可能な Composable にネストしてグリッド表示を作りたい場合は LazyVerticalGrid は利用できません(スクロール可能な Compo…

age++

おかしい。ついこの間 0x20 歳になったばかりだと思っていたのに、もう年齢がインクリメントされてしまった。 コロナはまだまだ収束しそうにないし、それどころか戦争が始まるし、あちこちてんやわんやのドッタンバッタン大騒ぎ感がありますが、私は元気です…

Bundle の大きさを知りたい

前回の Navigation Component の振る舞いに関する記事 に関連して、Activity#onSaveInstanceState などで最終的に Bundle がどの程度の大きさになっているのかを知りたくなったのでいろいろ試してみました。 blog.keithyokoma.dev 結論、次の Stack Overflow…

BottomNavigationView と Jetpack Navigation の組み合わせでバックスタック管理の挙動が変わり TransactionTooLargeException になるパターン

Jetpack Navigation 2.4.x から、multiple backstack がサポートされ、BottomNavigationView と組み合わせて下タブのタブごとにバックスタックを分けて管理できるようになりました。 例えば、A/B/C の 3 つのタブがあったとき、A タブでの画面遷移と B タブ…

AAC ViewModel と StateFlow を組み合わせたときのユニットテスト

前回の続きで、Kotlin Coroutines の StateFlow を利用した AAC ViewModel のテストをする場合の Kotlin Coroutines 1.6.0 の記述について。 blog.keithyokoma.dev StateFlow をつかった AAC ViewModel 次のような AAC ViewModel を継承した SomeViewModel …

グリッド表示とリスト表示を組み合わせた構造の画面を作る場合の Groupie と JetpackCompose の対比

様々な要素を組み合わせた一覧画面の構成 次の図のように、グリッドやリストを組み合わせた画面を作ることを考えます。 画面構成 RecyclerView を使う場合、Groupie を使うとかなり楽にこの画面構成を実現可能です。 Jetpack Compose を使う場合、1.1.0-beta…

RxJava と Kotlin Coroutines のテストチートシート

忘れそうになるのでメモ。テストは Kotest をつかっているが、極力 JUnit でのテストの記述と対比しやすいよう StringSpec で書いていく。 最近 RxJava から Kotlin Coroutines への乗り換えを進めていて、テストの書き方がどう異なるか(あるいは同様となる…

2021 振り返り

去年の年末の振り返りも発掘したので、同じような感じで振り返ってみます。 チームで育てる Android アプリ設計の出版 2020年振り返りでは、技術者視点でDXを上げていく活動 として前職での活動やアウトプットを軽く振り返っていました。その結実として今年…

Dagger Hilt と WorkManager を組み合わせて使う

Dagger Hilt は Android 用に様々な場面で使いやすいようになっていて、WorkManager を使った場合にも Dagger Hilt で DI が実現できるようになっています。 依存関係 Dagger Hilt と WorkManager を依存関係に追加します。2021/12 時点で Dagger Hilt の KS…