画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

DeepLinkDispatchにプルリクを出した

どういうライブラリかというと、こちらのスライドがわかりやすいと思う。

speakerdeck.com

とてもシンプルなライブラリ。

github.com

こんな感じのプルリクを出した。

上手くいかなかったパターン

今回は以下のようなケースで値が取れなかった

airbnb://foo/baz?marsh[max]=mallow

hoge[max]の値がnullになってしまっていた。

原因を追う

プルリクの中にも書いたけど、こんな感じ。 DeepLinkDispatchの中でクエリパラメータを取得する時に、 androidについてくるUriというライブラリを使っていた。 ざっくりと以下のような使われ方をしていた。

import android.net.Uri;

String urlString = "airbnb://foo/baz?marsh[max]=mallow";
Uri uri = Uri.parse(urlString);

uri.getQueryParameter("marsh[max]");  // null

uri.getQueryParameterNames(); // can get key(marsh[max])

getQueryParameterで値を取得していたのだけど、 それが何故かnullになってしまっていた。

https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/net/Uri.java#1649

ソース的にはこの辺のはず。たぶん。

んで、デバッグして調べていくと、

https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/net/Uri.java#1668

この辺でgetEncodedQuery()した結果がエンコードされていない状態になっていた。

marsh[max]=mallow

一方でキー(marsh[max])の方はエンコードされて

marsh%5Bmax%5D

という感じになっているので、その辺でおかしくなって値を取得する部分のif文の中に入らずにおかしくなってしまっている状態だった。

https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/net/Uri.java#289

さらに内部実装どうなってるかの見たかったけどどうすればいいかわからなかったー

android.net.Uriを頑張って修正したとしても既に世間にある端末の中身が全て変更される事はないので、まぁ、ライブラリを変更するのがいいのかなぁと思った。

プルリク

別の方法で実装しなきゃといろいろ調べてみたら、ライブラリの中で

https://github.com/airbnb/DeepLinkDispatch/blob/master/deeplinkdispatch/src/main/java/com/airbnb/deeplinkdispatch/DeepLinkUri.java#L325

queryParameterValuesという便利メソッドがあったので使ってみた。メソッドが存在しているけど使われてないのが疑問に思ったのだが、社内で使っているものをライブラリとして切り出した時に消し忘れたとかそんな感じなのかなぁ

Mergeされるといいなぁと思うけど、どうなんだろうかー。という感じ。