小説家になろうのAndroidアプリ「なろうTime」を作った

小説家になろう(以下、なろう)*1のランキング閲覧と小説リーダのAndroidアプリ、なろうTimeを作った。

github.com play.google.com

まぁ作ったと言ってもリリースしたのが2016年5月なので結構前に作ってた。
ちょこちょこアップデートしてたんだが、忙しくなってり他にやりたいことあったりと自分の中の優先度が低くなっていて最近はアップデートしていなかった。
それで、最近落ち着いてきたのでアップデートしようと思ったが、そういえば作ったことをブログに書いていなかったので振り返りもかねてブログを書く。

作った経緯

なぜなのかは自分でもきちんとわかってないんだけど、なろうの小説を読むのが好きで結構読んでる。
ただ、自分はわりと完結済みの小説しかよまない。
また、あまり少ない文字数小説とかもよまない。
なのでその辺りのフィルターを簡単に切り替えて見れるようにしたかった。
というのが最大の理由。

あとは詳細検索があまり見やすくなかったのでその辺も改善したかった。

機能紹介

ランキング閲覧 & フィルター

なろうでは、日間、週間、月間、四半期、累計の計5種類のランキングがあって、それぞれ300件*2が最初の画面でみれるようになってる。
右下にFABを表示してあって、それをクリックするとランキングに対してフィルターをかけることができる。
このフィルターは完結済み、ジャンル、最大/最小文字数でフィルターをかけることができる。
これは経緯で語ったやりたいことをフィルターとして実装した。
ただアプリ使ってて思ったのが、フィルターはランキング結果に対してかけるため、フィルターかけた後は数が減ってしまう。
でも、詳細検索でリクエスト投げれば普通にフィルターかけた後の結果で300件とってこれるのでそうすればいいじゃんって思ってきたので実装しようと思ってる。

あと、公式のWebページだと最初ジャンル別に日間、週間…と表示されてるんだけど、1番最初に見たいのは総合ランキングじゃない?と思って総合ランキングをデフォルトで表示している。
f:id:Nshiba:20170620014639j:plain f:id:Nshiba:20170620014644j:plain

詳細検索

詳細検索をやりやすくしたかった。
でも使っててあんまり改善できてないな…って感じてしまってるのでいい感じにしていきたい。
f:id:Nshiba:20170620014811j:plain f:id:Nshiba:20170620014821j:plain

小説ダウンロード

小説なのでオフラインで読みたいことがまぁまぁある。地下鉄とか。
ただ、今ダウンロードの進捗をダイアログで表示しているのでダイアログ閉じてしまうとダウンロードが中断されてしまう。
これはほんとに良くない仕様なのでNotificationとかに変更したい。
なぜこんな仕様にしたんだろう…
f:id:Nshiba:20170620014833j:plain

しおり

小説なのでしおり機能あったほうがいいよね、ということで実装した。
公式ではユーザに関するAPIはないのとでローカルDBに保存してる。
あとたとえAPIあったとしても、オフラインで読む場合はローカルにないと読み込めないので。

小説リーダ

文字色と背景色が変えられる。
これはレビューで変えたい、という要望があった。
あと、暗い所で読んだりとか、人によっては読みやすい背景色とかがありそう。

また、自動しおり付与機能もある。
ブラウザで読んでいて結構しおり挟む前にタブ消しちゃった、とかあるので。
自分でしおりを気にしなくていいのは結構快適になる。
f:id:Nshiba:20170620014721j:plain f:id:Nshiba:20170620014724j:plain

技術的なお話

振り返ってみて、作ったときの俺はなんでこんな実装したんだろう、とか結構あるので、これから改善したいことも含めて書く。

設計

MVP
作った当初はまだぜんぜん設計とかわかってなくて最初はArchitecture考えずに実装してた。 でもいじってるうちにどんどん辛くなり、とりあえずActivity/Fragmentにこれ以上実装書きたくなくて、分離するためにMVPにリファクタした。
個人的には、個人アプリ + 中規模くらいのアプリだったらそこまでたくさん層はわけずにMVPでいいじゃないかな、と思ってる。
ただ、自分自身、今までたくさん開発経験があるわけではなく、これからって感じで、いろいろ試していきたいので、設計部分は今後も思考錯誤していきたい。

DB

Realm
たしか特に検討するわけでもなく、とりあえずRealmを触ってみたかったのでRealmにした。
でも実際は、ローカルDBの機能しかつかってないし、そこまで速さが求められる使い方でもないので、個人的に使いやすいと思ってるOrmaに乗り換えたいなぁなんて最近は思ってる。
特にRealmのマイグレーション辛い…(今年に入ってマイグレーションしてないけど改善されたのかな)
複数プラットフォームに対応する、なんていうことがあったらRealmの出番かもしれない。

非同期通信

Okhttp + RxJava
定番のやつ。
ただ、RxJavaは非同期通信の部分でしか使えてなくて、今後Kotlinに以降しようかな、と考えているのでそこでお役目御免かなぁと思ってる。
これなんでRetrofit使わなかったんだろ。

雑感

こんな感じですがランキング部分はそこそこ使いやすいかと思うのでぜひ使ってみてほしいです。
使ってみた感想や欲しい機能なんかがあったらレビューもらえるとすごい嬉しい。

また、いろいろ振り返ってみたら、リファクタしたい所やいれたい機能なんかが浮かんできた。
他にも普段つかってて、なんか使いにくい機能あったり、バグが残っていたりともどかしい部分があるのでやっていくぞ。
あと、Kotlinにするぞ。

*1:http://syosetu.com/

*2:ランキングAPIで返ってくる件数