phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

Android

Droidkaigi 2023に参加しました

2023/09/14-09/16で開催されたDroidkaigi 2023に参加しました。オフラインでの参加は4年ぶりになります(去年はオンライン参加)。 前回のオフライン参加 phicdy.hatenablog.com 去年はオンラインで参加しましたが、あまり自分が見たいセッションが配信対象…

GradleのVersion CatalogとRenovateでAndroidアプリのライブラリアップデートを管理する

個人アプリのライブラリアップデートがしんどくなってきてちらほら見かけていたRenovateを試してみた github.com Renovateの設定 GithubであればRenovateのアプリを追加すれば簡単に初期設定が完了する。 github.com 初期設定が完了するとrenovate.jsonとい…

coil(というよりOkHttp)でディスクキャッシュのキーをURLから変更するのは難しい

Jetpack Composeでcoilを使うべく調査中。 coilのディスクキャッシュはOkHttpのディスクキャッシュを使っているがそのキーをURLから変更するのは難しそう。 環境 coil-compose 1.4.0 okhttp 4.9.3 coilのキャッシュ coil自体はディスクキャッシュの機構は持…

Coflicting 'on' color for a given backgroundエラーの修正

Jetpack Composeのテーマ設定をしていたら上記のようなエラーが出ていた。 エラー文を読むとonの色設定がコンフリクトしているらしい。例えばonPrimaryはprimary時の背景なので同じ色ならエラーなのかなと思ったが別の色を指定しているしよくわからなかった…

Gradle plugin 7.0.2にアップデート後Github Actionがコケる問題の対処

最新の環境にアップデートすべくGradle plugin 7.0.2にアップデートしたところなぜかGithub Actionがコケるようになってしまったのでその対処。 ちなみにローカルでビルドする分には問題なく、Bitriseはたまにコケる程度だった。 環境 Gradle plugin 7.0.2 G…

SQLDelightを導入するに当たって詰まったポイント

Roomは使ったことがあったので比較対象としてSQLDelightを試してみた際に詰まったポイントをメモ。 github.com cashapp.github.io 環境 Android Studio 4.1.3 SQLDelgiht 1.5.0 Gradle 6.8.3 既存アプリで別のデータベース管理中(バージョンは5) SQL Delig…

Dagger Hilt 2.31-alphaの変更に対応する

github.com やること implementation "androidx.hilt:hilt-lifecycle-viewmodel:$androidx_hilt_version" を消す kapt "androidx.hilt:hilt-compiler:$androidx_hilt_version" を消す ApplicationComponentをSingletonComponentに置き換える @ViewModelInjec…

ButtonのstateListAnimatorをnullにするとelevationがなくなるのはなぜか

環境 テーマはTheme.MaterialComponents.Light appcompat 1.2.0 material 1.2.1 minSdkVersion 23 コードを追う 継承関係を追うと、Theme.MaterialComponents.Light -> Base.Theme.MaterialComponents.Light -> Base.V21.Theme.MaterialComponents.Light -> …

Deep LinkとApp LinksとFirebase Dynamic Linksの使い分け

メール配信からアプリを起動させたい場合や、Webサービスの機能をアプリとして開きたい場合、起動したいURLをAndroidManifestのIntent Filterに定義してアプリを起動できるようにする。方法はだいたい3つに絞られるので使った体感をまとめておく。 Deep Link…

Android Architecture ComponentのNavigationとマルチモジュール

ここ何日かNavigationを使ったプロジェクトでどうマルチモジュールにするかを考えてました。 結論としては下図のように各featureはInterfaceのみに依存し、appで全画面遷移を解決するのが楽でした。 各featureはInterfaceにのみ依存する 画面遷移するfeature…

WorkManagerでWorkerを一意に実行して画面が死んでも復帰する

最近WorkManagerを使ってて少し嵌ったので書く。 環境 WorkManager 2.2.0 最新はappcompat 1.1.0に依存していて問題がちらほらあるので使わない Workerを一意に実行する Workerを一意に実行するにはWorkManagerのbeginUniqueWorkを使う。WorkContinuationか…

既存アプリのNavigation導入

Navigationを新規で入れるのは楽そうだなーと思いつつも現実的には既存アプリに入れることが多いと思う。自分の既存アプリに対して入れてみる。 developer.android.com 環境 Android Studio 3.6.1 Navigation 2.2.1 起動ActivityをFragmentに移行する 一旦To…

マルチモジュールのプロジェクトでdanger-android_lintを使う

Dangerでandroid lint結果をPR上でコメントしようと思うとdanger-android_lintを使うことになるがマルチモジュールに対応しておらずレポートを1つしか指定できない。 github.com マルチモジュールに対応する1つの方法はレポートをマージする。 qiita.com blo…

GitHub ActionでAndroidのCIを設定してみた

ベータを申し込んだら1日で有効になったので使ってみた help.github.com 設定 ひとまずPR時にUTとlintを並列で動かしてみる。 name: Android CI on: pull_request: branches: - develop jobs: unit_test: runs-on: ubuntu-latest steps: - uses: actions/che…

Kotlin Fest 2019に参加した #kotlinfest

2019/08/24(土)に行われたKotlin Fest 2019に参加しました。 kotlin.connpass.com 去年 phicdy.hatenablog.com 会場は去年と同じ東京コンファレンスセンター品川でした。 まい泉の軽食うまい。 トートバッグは黒にしました。 オープニング待機。 今年は英…

DangerでTextViewのandroid:maxLinesがないことをチェックしようとした

APIからデータを受け取ってTextViewに表示するとき、大きいデータだと際限なく表示されてしまうので android:maxLines を設定されたい。結構忘れがちなのでDangerで自動チェックしようとした...けどやりたかったことを全部満たすのは大変そうだったので妥協…

マルチモジュール時代のAdmob設定

広告を表示したいなと思いAdmobを調べていたんですが、せっかくならちゃんとDIしてマルチモジュールで利用できるようにしようと思いやってみました。この記事ではAdmobの設定方法などは省略します。 目標としてはappモジュール(分割済みなら各featureモジュ…

Chrome Custom TabでデフォルトブラウザがChrome以外の場合の対応

デフォルトブラウザがChrome以外のとき、FirefoxはChrome Custom Tabで開いてくれるがドルフィンブラウザなどは非対応のブラウザではそちらが開いてしまう。 Chrome Custom TabのIntentに com.android.chrome を指定してあげればChrome Custom Tabで開けるよ…

Androidのマルチモジュールでのjacoco設定

ハマったのでまとめておく。結論から言うとjacocoにアップロードしてGitHubのPR連携をする場合はレポートをマージする必要はない。マージしてしまうとパスを判別できなくなるせいかエラーになってしまう。 CircleCIで bash <(curl -s https://codecov.io/bas…

Koin 2.0へのマイグレーション

先日Koin 2.0が出たのでアップデートしてみました。 medium.com APIが変わっているのでマイグレーションが必要です。 エントリポイントの変更 1.0まではApplicationクラスでstartKoin()に自身とモジュールのリストを渡していましたが、DSLになり、個別に指定…

Android Gradle plugin 3.2.0からjacocoでJavaファイルのカバレッジが取れない問題の修正

通常はKotlinだけで書くと思うので関係ないです。Java -> Kotlin移行中のプロジェクトだと起きる。 ↓以前の記事 phicdy.hatenablog.com phicdy.hatenablog.com 原因 Product Falvorを free としたとき、Javaのクラスファイルの出力先がAndroid Gradle plugin…

?attr/selectableItemBackgroundは何色か

答え: アプリ・Activityに適用しているテーマ、起動するAndroid OS VersionとcompileSdkVersionとサポートライブラリのバージョンによる。 Theme.AppCompat.Light を使っていてAndroid 5.0以上でcompileSdkVersion 28でAndroidXなら #21000000 以下解説 ?att…

Droidkaigi 2019に参加しました

2019/2/7~2/8に行われたDroidkaigi 2019に参加してきました。 droidkaigi.jp 弁当おいしかった。 バリスタさんは長蛇の列でした。おいしかった。 今年はコントリビュートしました(左上) パーティーはめっちゃ人がいました... 以下参加したセッションのメモ…

Gradle plugin 3.3へのアップデート

先日Android Studio 3.3と共にGradle plugin 3.3.0がきたのでアップデートしてみた。 Crashlyticsを使っているとWarning WARNING: API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildPro…

個人アプリのAndroidX対応時のメモ

Support Libraryに依存した3rd party libraryが入っていないせいかあっさり終わった。 移行前の環境 Android Studio 3.2.1 compileSdkVersion 28 targetSdkVersion 28 Support Library 28.0.0 Refactor -> Migrate to AndroidX ほぼこれで終わる。ただこれだ…

FragmentでViewPagerを使うときにFragmentPagerAdapterに渡すFragmentManagerの注意点

嵌ったのでメモ。 BottomNavigationBar のタブの Fragment 内で ViewPager を使っていて、そのタブから別タブに切り替えて再びそのタブに戻ってきたとき、FragmentPagerAdapter#getItem() が呼ばれず、 ViewPager 内が再読込みされない現象が起きた。 調査の…

【Android】続・PreferenceFragmentCompatを使った設定画面

以下の記事を昔に書いたが、内容が古くなってきたようなので書き直す。 phicdy.hatenablog.com Androidの設定画面について AndroidではAPI1から設定画面を生成してくれる PreferenceActivity が用意されている Android 3.0で各設定画面をFragmentに分けるた…

Clean ArchitecutureにおけるKotlin coroutinesの処理と責務分け

自分の中で混乱してきたので整理する。 環境 Kotlin 1.2.71 Kotlin Coroutines 0.30.1 本題 以下のようなClean Architecuteベースの設計のアプリがあるとする。 このときKotlin Coroutineを使って非同期処理を行ってUIを更新するとする。 各クラスの責務を分…

Kotlin Fest 2018に参加した

2018/8/25に品川で開催されたKotlin Fest 2018に参加してきました。 kotlin.connpass.com 飲み物とか食事。パンプディング美味しかった。 mixiさんブースでやってKotlinクイズの景品。7問中3問正解でプランニングポーカーもらいました。 以下参加したセッシ…

【Android】他のアプリの上に重ねて表示まとめ

Androidの世界では基本的に1アプリのみが前面に出る。 しかし android.permission.SYSTEM_ALERT_WINDOW を宣言することで他のアプリが前面の場合でも Viewを表示できる Android 6.0未満 制限はなく、 android.permission.SYSTEM_ALERT_WINDOW を宣言するだけ…