nashcft's blog

時々何か書く。

Cast SDK の KTX ライブラリを作っている

github.com

夏頃から社のアプリの Cast 機能まわりを触り始めてて、しばらくして本格的に機能開発に関わるようになったところで一旦きちんとAPIさらっておくかーと思ったのと、ついでに Kotlin サポート欲しいけどすぐ出てこなそうだから自分で作るかーってなったので作り始めた。

今のところ簡単なことしかやってなくて、とりあえず Builder class でのオブジェクト生成を scope function で書けるようにしたのと、play-services-cast-framework 向けに RemoteMediaClient などにある PendingResult を用いた通信を suspending function として呼べるようにした程度。 play-services-cast-tv の Modifier や Writer 向けにも scope function 使えるようにしようかと考えてるけどこの辺まだ殆ど触ってないので使用感がわからず手をつけてない。

Builder をネストできる箇所があって、そういう所は scope function で表現すると呼べる関数が混ざって事故るよなーとは思ってて、 @DslMarker 使ってアクセスできる receiver の制限できないか試してみたけど、筋よく実装できなそうなので諦めた。

Type-Safe Builders - Kotlin Programming Language

外部のライブラリに対して @DslMarker の機能を有効にするには、対象を継承した自作 class を作ってそれに @DslMarker を適用した annotation class を当て、そちらの class を receiver にした lambda を受け取る関数を実装する必要がある。しかし Cast SDK の Builder class の中には LaunchOptions.Builder など final class になってて継承できないものがあり、それらは wrapper class みたいなものを書かないと receiver の制限を実現できない。そんな class はメンテ面倒だし、 Builder class が継承可能というのも変な話で今後他の Builder も final を付けられていくのが妥当だろうと思う。

Cast SDK 自体外から拡張できる要素はそんなにない印象だけど、今ある cast-sdk-ktxAPIは私が会社のアプリで読んだり触ったりした部分で使われてた機能に対して作れたものみたいなところがあるので、まだ手薄な部分がなくはないと思う。Cast 機能実装している各位の秘伝の拡張関数みたいなのがあったら pull request を出してくれると嬉しい。

本当は KTX ライブラリは本体を開発してるところがメンテしてるのが一番良いと考えているので Google に貰われないかなってちょっと思っていたりする。ないだろうけど。