KotlinでAndroid Java向けSDK(e.g. Milkcocoa)を使ってみる

この記事は、[Kotlin Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kotlin) 18日目の記事です。
（マッシュアップ企画ということで、[Milkcocoa Advent Calendar 2016](http://qiita.com/advent-calendar/2016/milkcocoa) 17日目も同時担当させて頂きます。）

KotlinはJavaとほぼ完全な互換性があるとのことなので、Javaで使っていたライブラリもそのまま使えるのではと思い、試してみました。
今回は「Milkcocoa」というサービスのAndroid Java SDKをKotlinで使ってみたいと思います。

## Milkcocoaについて

https://mlkcca.com/

>Milkcocoaは、IoTデバイス・スマートフォン・PC間で簡単にリアルタイムなデータのやり取りが出来るようになるクラウドプラットフォームです。

IoT領域に特化したバックエンドサービスです。<b>サーバレスで手軽にリアルタイム通信・データストア/ロードができる</b>ので、Webやスマホアプリでも利用されるケースが増えています。

Android向けのSDKはこちらで公開されています。
https://github.com/milk-cocoa/milkcocoa_for_android

SDKを使ったサンプルプロジェクトも公開されているので、こちらを参考に書いてみます。
https://github.com/milk-cocoa/android-examples

## Kotlin × Milkcocoa
Milkcocoaのライブラリファイルは、`libs`配下に配置します。
<img width="347" alt="スクリーンショット 2016-12-18 13.45.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/19403ba5-171f-c390-c148-5c576d4ed0e4.png">

gradleファイルの`dependencies`にライブラリの参照を記載します。

```build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile files ('libs/milkcocoa.jar')
}
```

　「ボタンを押すとMilkcocoaにデータをPushする」という単純なサンプルアプリを作りました。

```MainActivity.kt
package com.shanonim.kotlinmilkcocoa

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.Toast
import com.mlkcca.client.DataElementValue
import com.mlkcca.client.MilkCocoa
import java.util.*

class MainActivity : AppCompatActivity() {

    val MILKCOCOA_KEY = "YOUR_MILKCOCOA_KEY"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val pushButton = findViewById(R.id.button_milkcocoa_push) as Button
        pushButton.setOnClickListener {
            val params = DataElementValue()
            params.put("content", "this is message from kotlin.")
            params.put("date", Date().time)
            MilkCocoa(MILKCOCOA_KEY).dataStore("message").push(params)

            Toast.makeText(this, "Pushed", Toast.LENGTH_SHORT).show()
        }
    }
}
```

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.shanonim.kotlinmilkcocoa.MainActivity">

    <Button
        android:id="@+id/button_milkcocoa_push"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:text="Push to Milkcocoa" />
</RelativeLayout>
```

## 動作確認
アプリの画面です。
![Screenshot_2016-12-19-00-35-56.png](https://qiita-image-store.s3.amazonaws.com/0/38442/b053bdd5-a0d6-f0fb-f9f6-3fbe2184310d.png)

ボタンを押すと、Milkcocoaのプラットフォーム上にデータが保存されていることが確認できました。
<img width="1240" alt="スクリーンショット 2016-12-19 0.36.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/5f605fc0-9f3c-ab7d-950c-ccde1f9ce468.png">

## ハマったポイント
ライブラリとして使用する`milkcocoa.jar`ですが、[前述のGithub](https://github.com/milk-cocoa/milkcocoa_for_android)にあるファイルを使用すると、データ送信時に以下のエラーが発生します。

```
MqttException (0)
     at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:80)
     at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:286)
     at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:167)
     at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:224)
     at com.mlkcca.client.Transporter.connect(Transporter.java:105)
     at com.mlkcca.client.Transporter.<init>(Transporter.java:46)
     at com.mlkcca.client.MilkCocoa.init(MilkCocoa.java:50)
     at com.mlkcca.client.MilkCocoa.<init>(MilkCocoa.java:35)
     at com.shanonim.kotlinmilkcocoa.MainActivity$onCreate$1.onClick(MainActivity.kt:24)
     at android.view.View.performClick(View.java:3523)
     at android.view.View$PerformClick.run(View.java:14130)
     at android.os.Handler.handleCallback(Handler.java:605)
     at android.os.Handler.dispatchMessage(Handler.java:92)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:4424)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:511)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
     at dalvik.system.NativeStart.main(Native Method)
Unable to set up client: MqttException (0)
```

サンプルプロジェクトで使われているjarファイルを使用するとうまくいったので、こちらを使いましょう。
https://github.com/milk-cocoa/android-examples/blob/master/MilkChat2/app/libs/milkcocoa.jar

## 所感
今までJavaで使っていたライブラリをKotlinでもスムーズに使えることが実感できてよかったです。ライブラリを参照するコード自体も、Javaで書くのに比べて簡潔で分かりやすいものになりました。

<img width="538" alt="スクリーンショット 2016-12-18 15.32.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/0ee5c702-15c6-f596-7b48-a74d59e05bc3.png">


これからもどんどんKotlinやっていきたいと思います。

## 参考サイト
- Milkcocoa Android SDKのαバージョンを公開しました。
http://qiita.com/technicalrockstarsinc/items/deaf227b4c5568b08b05
- AndroidからMilkcocoaを使って見るメモ #mlkcca　　
http://qiita.com/n0bisuke/items/2680938a3ce9fd70ce88