利き酒アプリ開発

# はじめに
どうも，日本酒好きなエンジニアです．
日本酒とKotlinによるAndroidアプリ開発の勉強のために，利き酒アプリを作りましたので，ソースコードを共有いたします．
課題は残るものの一通り動くようになっていますので，アプリ開発の参考にしていただいたり，改造して使っていただければ幸いです．

## アプリ画面

![top.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555313/8e8c589e-a611-f779-74ac-68f07eca8a1f.jpeg)
図1. トップ画面

![info.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555313/8cdc34d8-1be0-2346-03f7-01373e2970b3.jpeg)
図2. 酒情報（分類）

![review.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555313/8507708e-fba0-9be0-89be-03bc178cb9ba.jpeg)
図3. レビュー画面

## 公開

紹介動画:
https://youtu.be/l4n4CSIhghM 

コード:
https://github.com/pyth0n14n/TastingGenie/tree/master

アプリの使い方や開発メモなどはGitHub上のPDFに記載してあります．

## 開発環境
- Android Studio 3.5.1  
minSdkVersion 21, targetSdkVersion 28
- Kotlin 1.3.11
- Anko 0.10.8

# 技術的な内容
このアプリで得られる情報と，残る課題について示します．

## 開発の参考になりそうな情報
私がKotlinを触るうえで苦戦したポイントと，解決した課題は以下のとおりです．ソースコードを見ると，どのように実装するかの参考になるかと思います．

- Activity-Fragment連携による状態遷移
- FragmentのListenerをActivityで処理する方法
- カメラ・ドキュメントから画像の登録 (図1)
- RecyclerView + CardViewによるデータのリスト表示 (図1)
- 1要素選択式のExpandableListview
- ヘルプ付きのExpandableListview + Checkbox (図2)
- 動的なLinearLayoutの追加 (図2のヘルプ部分)
- 酒情報，レビュー情報のSQLite3によるデータベース化
- ちょっとイケてる風のUI (図3)

## 残る課題
- カメラ・ドキュメントを使用するための権限の確認  
今は権限がないと落ちる
- 画像の保存ディレクトリを任意にする  
MediaStoreの使い方がイマイチ分かっていない
- DBの更新処理  
DBにアクセスする回数を減らしたい
- 各種例外処理  
今はなんとなく実装している
- 画像の削除  
DBからリストを削除した時に，関連する画像も削除したい
- 一部の値がハードコードされている
- 検索機能  
酒情報やレビュー情報をフィルタリングして表示したい
- DB解析機能  
好みの酒のタイプを割り出したりしたい
- ヘルプ機能  
利き酒のやり方や，香りに関する説明を追加したい
- エクセル書き出し機能  
DBの内容を書き出したい

# 開発の背景など
なぜ「利酒魔人1号」を開発することにしたかを説明します．

## なぜ日本酒か（モチベーション・開発目的）
友達と温泉に行った際に，よく日本酒の利き酒をするのですが，全く当てられません．これは，自分の中で評価指標がなく，異なる酒が同じエリアにマッピングされているためだと考えました．

既存の日本酒用の利き酒アプリを探してみましたが，アプリの紹介画像から判断したところ，自由記述式のものが多いように思いました．これは，すでに評価軸があるユーザや，備忘録的な使い方で酒を楽しみたいユーザにとってはとても便利ですが，私の目的とは合っていないように思いました．

そこで，利き酒のやり方に則った評価指標を詰め込んだAndroidアプリを開発しました．自由記述式（感想など）の既存アプリでは解決できない「どう評価したらよいかわからない」を解決することが目的です．

## 謎のキャラについて
![tasting_genie_xxxhdpi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555313/7744588e-f85f-37eb-1b3a-493509b3664c.png)
私がAndroidアプリ開発勉強のためにはじめて作ったアプリが割勘アプリでした．アプリ名が「割勘魔人2号」という名前でした（理由は失念）．今回も，その流れを踏襲して，「利酒魔人1号」というアプリ名にしました．

## なぜKotlinか
- エンジニアは新しいものに触るべきだと思っているから
- Javaが好きじゃない
- Kotlinという名前が可愛い

# 参考情報

**日本酒や利き酒に関して**
[1]	“木村克己”, 日本酒の教科書, 新星出版社, 2010
[2]	利き酒（ききざけ）のコツ
　http://www.kamofuku.co.jp/hissyouhou/hissyouhou.htm
[3]	日本酒テイスティングの訓練方法
　http://日本酒.biz/category20/entry204.html
[4]	利き酒のやり方
　http://wakabajirushi.fc2web.com/kikisake.html
[5]	KURAND 「これであなたも利き酒師気分！日本酒を表現するための言葉（色・香り・味）」
　https://kurand.jp/blog/sake-taste-smell-color-kikizake/
[6]	極私的なワインテイスティングノート「日本酒テイスティングシートを作ってみました」
　http://tnishino.blogspot.com/2015/01/blog-post.html
[7]	ネタ酒場研究会「テイスティングノートのススメ」
　http://www.netasakaba.net/?page_id=5232
[8]	灘酒研究会
　http://www.nada-ken.com/main/

**アプリ開発に関して**

*Fragment遷移*
[9] Fragmentによる画面遷移でハマった
　https://qiita.com/tomo1139/items/62902093d1850085742d
[10] araemon/AndroidExercise
　https://github.com/araemon/AndroidExercise/tree/master/TryFragment/app/src/main/java/com/apppppp/tryfragment
[11] Android 戻るボタンを押した時、積み上げたBackStackを1つ飛ばした画面に戻りたい 
　https://symfoware.blog.fc2.com/blog-entry-2037.html

*データベース*
[12] KotlinでAndroidアプリを開発（AnkoでSQLiteと一覧表示編）
　https://qiita.com/naoi/items/6e6152c90c4219bbb055
[13] Anko-SQLite
　https://github.com/Kotlin/anko/wiki/Anko-SQLite

*画像*
[14] [android]ギャラリーもしくはカメラから画像を持ってくる
　https://qiita.com/yukiyamadajp/items/137d15a4e65ed2308787
[15] ギャラリーから画像のURIとBitmapを取得する色んな方法
　https://qiita.com/furusin_oriver/items/b6875f0703dbd49e7737
[16] Android　大きい画像を効果的に読み込む 
　http://y-anz-m.blogspot.com/2012/08/android.html
[17] Android: Bitmapを画面サイズにリサイズする 
　http://319ring.net/blog/archives/1504/
[18] [Android開発]削除した画像ファイルをギャラリーから削除する
　https://erikori.com/blog/2015/06/13/android%E9%96%8B%E7%99%BA%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%AE%E3%83%A3%E3%83%A9%E3%83%AA%E3%83%BC%E3%81%8B%E3%82%89%E5%89%8A/
[19] [Android] 外部ストレージに画像を保存・読出しをする
https://akira-watson.com/android/external-storage-image.html

*リスト表示*
[20] KotlinでRecyclerViewを使ったリスト表示を行う
　https://qiita.com/Todate/items/297bc3e4d0f3d2477ed3
[21] RecyclerViewをAdapter.notifyDataSetChanged()を用いて更新できなかった理由を考察してみた
　https://qiita.com/koujin/items/0bddffdab8f282a3cc6b
[22] Is it possible to create an expandable list AlertDialog?
　https://stackoverflow.com/questions/6643625/is-it-possible-to-create-an-expandable-list-alertdialog
[23] Android ExpandableListView Using Kotlin With Example
　https://tutorialwing.com/android-expandablelistview-using-kotlin-example/
[24] How to get checkbox state in expandable listview in android
　https://stackoverflow.com/questions/33301708/how-to-get-checkbox-state-in-expandable-listview-in-android

*ダイアログ*
[25] 【Android】パパっと使えるAlertDialog一覧
　https://qiita.com/hokutonikukyu/items/ebbc0318c07035e04bf7
[26] Android - Custom Dialog with List Of Items (Java & Kotlin) !!
　https://medium.com/@makkenasrinivasarao1/android-custom-dialog-with-list-of-items-ba1ab0e78e16

*Kotlin*
[27] Kotlin ExtensionsのParcelizeアノテーションでdata classをスッキリさせる 
http://tech.furyu.jp/blog/?p=6378
[28] Uri → String、String → Uri の型変換
　https://qiita.com/superman9387/items/56ef1bd3f98f5eab5244
[29] Kotlinで時間を選ぶPickerを扱う
　https://qiita.com/sass9872/items/b01d024f52249f79f316
[30] Calendar型⇄Date型の変換
　https://hacknote.jp/archives/24285/
[31] onTouchは1回タッチで2回呼ばれる。
　http://blog.livedoor.jp/shizuku_kun/archives/51362627.html
[32] SharedPreferences でアプリの設定値を保存する
　https://maku77.github.io/android/fw/shared-preference.html
[33] Kotlin らしく SharedPreferences をシンプルに扱う Extension を実装する (Moshi Json シリアライズ対応)
　https://qiita.com/irgaly/items/4b149068b2f62289e7a5
[34] AndroidでViewを角丸にする
　https://qiita.com/masaibar/items/3df3ebbb981cd274fe78