fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

robolectric4.5-alpha-1かそれより新しいバージョンを使ってSQLiteのCommon Table Expressionを使ったテーブルのJVMテストをしよう

事の発端: テスト書こうとしたら Caused by: com.almworks.sqlite4java.SQLiteException: [1] DB[1] prepare() CREATE VIEW `view_foo` AS WITH bar AS ( ... [near "WITH": syntax error] がでたので今日は終了— まつだあきひと (@akihito104) 2020年12月1…

自作のViewGroupをRobolectricでテストしつつ開発する その2

つづきです: akihito104.hatenablog.com fragment-testingを使おう 前回の記事では空のActivityにカスタムビューをアタッチしてからテストしているが、androidxのfragment-testingというライブラリを使うのが楽そうというか正しそうなのでこちらを使いましょ…

投稿する写真をカメラアプリで撮って送るついでにギャラリーアプリから見えるようにする(API Level 22+)

今回やりたいこと 投稿する画像をギャラリーから選ぶかカメラで撮るかして取得したいのでIntent Chooserを出したい いい機会なのでActivityResultContractを使いたい tweet input: enable sending media · Issue #130 · akihito104/UdonRoad2 · GitHub 前提 …

fluxとかMVIみたいな構造のアプリを作ってみたかった その4

つづきです: akihito104.hatenablog.com このツイートに関連して困ったことが起きている。 layout inspectorを起動するとActivityが再生成されるのかいろいろバグってしまうしそれによってViewの様子も変わってしまうので結局何がしたかったのかわからないと…

androidx.lifecycle.toLiveData()では内部的にpostValue()が使われているという話

androidのライブラリ lifecycle-reactivestreams-ktx にはRxJavaの Publisher<T> を LiveData<T> に変換する拡張関数 androidx.lifecycle.toLiveData() がある。この関数が返してくるLiveDataの実装クラス LiveDataReactiveStreams.PublisherLiveData は、RxのonNe</t></t>…

fluxとかMVIみたいな構造のアプリを作ってみたかった その3

つづきです akihito104.hatenablog.com 今:Eventを流してModelを更新し、その結果ViewStateが更新される 課題:Modelを更新したときに出てくる例外をどうするか 例えばこんな感じのハッピーパスしか考えてないやつ(スレッドとか中断関数とかそういうことは…

fluxとかMVIみたいな構造のアプリを作ってみたかった その2

以前書いたこの記事 akihito104.hatenablog.com の中で、 最初はViewStatesに入れれば一方向のフローになるかなと思ってやってみたんだけどkaptがメッセージ無しの謎のエラーを吐いてこれを解決できなかったので断念した というようなことを書いた。今回はこ…

WeakReferenceに包みつつNonNullなプロパティとしてアクセスするためのデリゲートプロパティ

例えばこういうのを private val _foo= WeakReference<FooActivity>(activity) private val foo: FooActivity get() = requireNotNull(_foo.get()) こんな感じで private val foo: FooActivity by weakRef(activity) 使えるようにしたい。そんなときはデリゲートプロパテ</fooactivity>…

fluxとかMVIみたいな構造のアプリを作ってみたかった

fluxとかMVIみたいなリアクティブ?な構造のアプリを作ってみたかったのでやってみた。Cycle.jsのドキュメントを参考にして自分なりにかみくだきながら作っていったので気持ちとしてはMVIのような感じだけど、実際に自分で作ったものが何なのかはわからない…

R8でコードシュリンクしつつInstrumentation Testをやる

いろいろハマってしんどかったので雑にまとめておく。 github.com ことの顛末 Instrumentation Testのテストが全然動かない。テストがないとか言われる LogcatをみるとDaggerTestAppComponentをDaggerAppComponentにキャストできませんとか言われている。そ…

SavedStateHandleを使ってLiveDataの値を保存する

ViewModelが持っているLiveDataの値をインスタンスステートとして保持したいとき、androidxのlifecycle-viewmodel-savedstateライブラリを使う。fragment 1.2.0やactivity 1.1.0を入れているとその依存関係としてsavedstateも入ってくる*1。この記事ではlife…

danger-kotlinをやっていこう

DangerfileをKotlin scriptで書けるというので試してみている。今の時点ではver. 0.5.1でWIPとのこと。 github.com Github Actionsで実際に動かしてみているのだが、これまでDangerで使っていたようなプラグインが使えるようにはなっていないようで、今のと…

重い腰を上げてテストのないクラスのテストを書くときまず最初にやること

テスト書くの後回しにしちゃったなーでもこの関数のテスト書かなきゃ…みたいなとき、まずどうするか。大事なことは最初のハードルを下げたり、ステップを小刻みにすること。 とりあえず最初はテスト対象のインスタンスを生成してそれがNonNullであるというテ…

RobolectricのSQLiteの実装がPRAGMA defer_foreign_keysをサポートしていなかった

androidTestで使うDBのデータをセットアップするという記事を以前書いた。 akihito104.hatenablog.com 今回はこれをJUnitテストでも使えるようにしようとしてはまったポイント。 robolectricで使ってるsqliteの内部実装がdefer_foreign_keysに対応してないっ…

NavigationとMaterialContainerTransformを使う

github.com なんかいろいろあったのでメモ。 今回の前提 implementation "androidx.navigation:navigation-fragment-ktx:2.3.0-alpha06" implementation "androidx.navigation:navigation-ui-ktx:2.3.0-alpha06" implementation "com.google.android.materia…

Activityでタッチイベントを流しなおす

(これはフィクションです) タブレット向けのすごろくアプリを作ります。デジタルとアナログの融合とかそういう企画らしくてリアルなコマを画面の上に置くらしいです。さいころはアプリのUIをタップして振ります。いつもはエミュレータ上でアプリを動かしな…

nasneの録画予約の時刻表現をパースしてついでに曜日のローカル表現を取得する

まず何はなくともthreetenABPを入れる。 implementation 'com.jakewharton.threetenabp:threetenabp:1.2.3' 時刻表現のフォーマット Java8のDate and Time APIのDateTimeFormatterにはいくつかのフォーマットがすでに登録されている。 DateTimeFormatter (Ja…

特定のタスクに依存したりさせたりしたいがflavorがいっぱいあって手で全部書くのがつらい時

project.afterEvaluate のブロックの中なら評価後のすべてのタスクを列挙できる。例えば特定のFlavorのあるタスクの前にしたいことがあるなら project.afterEvaluate { tasks.findAll { ... }.forEach { t -> t.dependsOn(...) } }

WorkManagerのWorkerにDagger2でDIする

今回の前提: implementation "androidx.work:work-runtime-ktx:2.3.1" api "com.google.dagger:dagger:2.26" kapt "com.google.dagger:dagger-compiler:2.26" WorkerはWorkManagerによって生成される。デフォルトではContextとWorkerParametersが渡されて初…

CoroutineLiveDataをどうにかしてテストする

関数androidx.lifecycle.livedataからCoroutineLiveDataというLiveDataを取得できる(CoroutineLiveDataはinternalクラスなので実際見えるのはLiveData )。例えば次のような感じで中断関数を渡してやるとライフサイクルとかとの関係をいい感じにやってくれ…

自作のViewGroupをRobolectricでテストしつつ開発する

2020/12/02追記: Activityじゃなくてfragment-testingを使いましょうという感じの記事をかきました akihito104.hatenablog.com 追記ここまで ViewGroupのonLayout()が呼ばれた後でいろいろやるクラスを作ることになったので、ユニットテストを書きながら実装…

rotationを指定したViewをEspressoでクリックできない件

github.com クローンしてエミュレータなどでandroidTestを実行してみてください。 なぜ? EspressoのViewActions.click()は内部でGeneralClickActionを使ってクリックアクションを作っている。GeneralClickActionを生成する際にいくつか引数を渡す必要がある…

UIテストでDBに入れるデータをテストアプリのassetsとして管理する

モチベーション サーバーとは独立した環境でテストを行えるようにしたかった 必要なデータの種類が結構多いのでテストコードの中でデータを作ってDAOからDBにInsertしまくるというのが面倒くさそうだった OkHttpのMockサーバーから返すレスポンスをテストコ…

頭外音像定位アプリのプロジェクトにandroidx.benchmarkを導入してみた

これです github.com androidx.benchmarkは何となく気になっていたので、冬休みの間の宿題として、数年前に作ったあと放置していたリポジトリをほじくり返してこれに導入してみることにした。何をやっているのかは akihito104.hatenablog.com にだいたい書い…

2019年に見たアニメ

いつものやつをやります。例によって50音順です。カッコ[]付きは未視聴(録画消化待ち)です。今年は全体的にジャンプのアニメが強かったですね。 トルネの不調に泣かされた年でもあった。ほとんどのアニメを1クール遅れで視聴した*1のだがそのせいか円盤を…

lottie-androidのgetCurrentKeyframe()の性能を改善するパッチが取り込まれた

github.com モチベーション BaseKeyframeAnimation.getCurrentKeyframe()は、アニメーションのプログレス(0から1の実数で表されるアニメーションの進捗度合い)の値にあうKeyframeを返すメソッド。このKeyframeはsetProgress()の際にキャッシュされている。…

RecyclerViewのようなものを作ろうとしたけどうまくいかなかった

仕事で作ったクラスの構造がよくなかったのでそのその反省を少しまとめてみる。 Adapterとは別にLayoutManager的なものも作る必要があったので、RecyclerViewの構造を参考にして似たようなものを作ることにした。RecyclerViewをなんとかして使えるようにすれ…

lottie-androidの大雑把な処理の流れ

処理時間の性能改善をするとき、いつもはまずどこに伸びしろがありそうかあたりを付けるためにメソッドトレースのFlame Chartを見ている。LottieSampleの場合は大体setProgress()かdrawかそれ以外(プログレスバーとかログ出力)に分かれていて*1、これを見…

lottie-androidの色の補間処理の性能を改善するパッチが取り込まれた

これです github.com ChangelogにはMinor performance optimizationと書かれていることからもわかる通り全然大したことない改善なんだけど、今やっているプロジェクトではこういうのも馬鹿にはできないというレベルで厳しいので取り込んでもらえたのがありが…

lottie-androidで気を付けたいこと(追記あり)

今回のモチベーション デザイナーさんにアプリのスクショを送ったらlottieのパーツの色が少し濃いように見えるという話になった lottie-android: version. 3.0.7 問題のパーツは、透明度の指定されたレイヤーがいくつか重なっているもので、絵が重なっている…