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

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をサポートしなければならない場合がある・・・ しかし、…

【Android】リリース署名の設定をプロジェクト外から上書きする

GitHubでソースを公開していてリリース署名の設定をしたい場合、公開用にはダミーの署名を置き、手元ではそれを上書きしたい。かつ git status でnot stagedのところに上書き内容がいちいち出ないようにプロジェクト外から上書きしたい。 gradle.properties …

【Android】Toolbarの矢印をタップしたら画面を閉じる

ポイントはonOptionsItemSelected()でandroid.R.id.homeをハンドリングしないと反応してくれない点 class MainActivity: AppCompatActivity { ... override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate menu resource file. menuInflater.in…

RxJavaのflatMap(mapper, combine)でリストデータをそれぞれ別スレッドで非同期処理する

例えばRSSのリストがあり、それを別々のスレッドで処理して全部の処理が終わったらUIを更新したいとする。 RxJavaのflatMap(mapper, combine)を使えばリストのデータを1つ1つのObservable/Flowableに変換して処理できる。 まず第一引数のmapper部分でそれぞ…

Macに外付けキーボードをつなげるときの設定

自分用。 環境 Mac OS 10.12.6 Karabiner-Elements 11.6.0 日本語外付けキーボード 手順 Karabiner-Elementsをインストールする。 Complex Modifications -> Add rule -> Import more rules from Internet(open a web browser) -> For Japanese (日本語環境…

kotlinのファイルをjacocoのコードカバレッジ対象に入れる

久し振りにjacocoの結果みたらあれ・・・なんか結果がおかしいなとなった。 よく見てみるとkotlinに変換したファイル達がコードカバレッジ対象から外れていた・・・ phicdy.hatenablog.com 以下で対応できた sourceDirectories に src/main/kotlin を入れる…

Nature Remoを買った

去年の11/5に注文して12/23に届いた。 13000円。 今在庫を見てみたら2~3日後配達になっていてかなり在庫が充実している・・・ nature.global (置き方がこれでいいかは疑問が残る・・・) いわゆるスマートリモコンで赤外線リモコンで操作できる家電(エアコ…

java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

UIテストを実行しようとしたらエラー・・・ ひとまずRun with --stacktraceを押してみる。 ... Caused by: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge.DexMerger$8.updateIndex(DexMerger.ja…