phicdy devlog

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

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

Droidkaigi 2023に参加しました

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

launchd/launchctlで定期実行する際に詰まったポイント

Macではcronよりlaunchdで定期実行が推奨されているらしいので設定してみた。 support.apple.com 基本的には下記記事を参考にplistファイルを作ればよいが1つだけ詰まったポイントがあった。 qiita.com /bin/bashでスクリプトを実行するときOperation not pe…

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…

tmuxのウィンドウの右上にgitの現在のブランチを表示する

環境 tmux 3.0a ~/.tmux.confの設定 set -g status-right "#(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD)" # 長いブランチだと表示できないので表示文字数を増やす set -g status-right-length 30 色を変えたかったので指定 set -g status-r…

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 -> …

Kotlin Coroutinesで非同期に処理を複数開始して全ての結果を待つ

例えばListの各値に対して非同期に処理を開始してその全ての結果を待って通知したいとする。 こういったときはcoroutineScope内でListの項目ごとにasyncしてdeferredのlistを作りawaitAll()すればよい。結果もListとして受け取ることができる。 suspend fun …

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…

Thinkpad X1 Carbon 7th(2019)を買いました

ある日Macbook Proの電源を入れると画面が映らなくなってしまいました... 外部ディスプレイに繋げば使えるのでiMacとして使えますがさすがに手元で使えないのは不便なので買い換えることにしました。 色々悩んだ結果、Thinkpad X1 Carbon 7th(2019)に乗り換…

2019年振り返り

2019年ももう終わりなので1年を振り返ろうかなと思います。 リニューアルプロジェクト 今年の1月〜4月は昨年から続くリニューアルプロジェクトをやっていました。今は7人いるAndroidエンジニアもこの時はまだ私ともう1人しかAndroidエンジニアがいなくてヒー…

Kotlin Coroutinesで並列にListの各項目を処理する

coroutineScope { list.map { async { updateListItem(it) } } .map { val updated = it.await() ... } } 最初のmapで処理を走らせてしまうと処理待ちになって逐次実行になる。そのためまず最初のmapですべてのListの項目の処理を遅延実行し、次のmapで各処…

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

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

MarkdownエディターをEvernoteからBoostoneに乗り換えてDropbox Paperに乗り換えた

tl;dr Evernote Boostnote Notion Inkdrop Dropbox Paper Markdown対応 ○(Markdown here使用) ○ ○ ○ ○ 無料もしくは買い切りの有料(サブスクでない) △(3台目からは要サブスク) ○(無料) ☓(サブスク) ☓(サブスク) ○(無料) メモ内容で検索できる …

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になり、個別に指定…

Macbook Pro(15-inch, 2016)のキーボードが2回押されるので修理に出した

これです。 www.apple.com 実は買ってから結構序盤の段階でbが2回押されたり1回も押されなかったりする問題が起きてました。上のプログラムが発表されてからいつか修理に出したいなーと思いつつも1週間くらいPCないのはなーと思いとどまってました。このゴー…

Ultimate Hacking Keyboardを買いました

会社ではErgoDoxを使っていますが、リモートワークするときに毎回持って帰るのがめんどくさいなーと思って会社の自作キーボードチャンネルを見ていたところ良さげな分離キーボードだったので買ってみました。去年の11/3に注文して3/21にようやく到着した。 u…

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

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