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

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…

?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 ほぼこれで終わる。ただこれだ…

Google Home+Nature Remo+IFTTTを使って音声でテレビの入力を切り替える

今リビングで使っているテレビでは入力1がPS4、入力2がChromecast、入力3がNintendo Switchとなっている。テレビは基本的にPS4のトルネで見ている。 よくChromecastでYoutubeを見たりすると入力が切り替わるのだが、Chromecastに入力切替の操作が奪われてし…

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 を宣言するだけ…

【Android】Google AnalyticsからFirebaseへの乗り換え

Firebaseを使ってみたかったので置き換えてみた。 プロジェクトのbuild.gradle dependencies { ... classpath 'com.google.gms:google-services:4.0.0' } アプリのbuild.gradle dependencies { ... implementation "com.google.firebase:firebase-core:16.0.…

ErgoDoxのキースイッチを交換する

最近どうもdが押しにくく、ファームウェアをアップデートしても直らなかったため、キースイッチを交換することにしました。 okapies.hateblo.jp を参考にやりました。 必要なもの キーキャップを引き抜く器具(494円) https://www.amazon.co.jp/FILCO-Keypull…

targetSdkVersion 26でAndroid 2.3をサポートすることのコストの高さ

今年の11月以降、Google PlayにはtargetSdkVersion26(Android 8.0)以上のアプリしかアップロードできなくなる(新規アプリは8月)。 developers-jp.googleblog.com それでも状況によってはAndroid 2.3をサポートしなければならない場合がある・・・ しかし、…