2018-01-12 10:01:25 +01:00
|
|
|
package jp.juggler.subwaytooter.util
|
|
|
|
|
2018-02-06 21:41:30 +01:00
|
|
|
import android.content.Context
|
2018-01-12 10:01:25 +01:00
|
|
|
import okhttp3.*
|
2018-02-06 21:41:30 +01:00
|
|
|
import android.net.ConnectivityManager
|
|
|
|
import android.net.NetworkInfo
|
2018-01-12 10:01:25 +01:00
|
|
|
|
|
|
|
// okhttpそのままだとモックしづらいので
|
|
|
|
// リクエストを投げてレスポンスを得る部分をインタフェースにまとめる
|
|
|
|
|
|
|
|
interface CurrentCallCallback {
|
|
|
|
fun onCallCreated(call : Call)
|
|
|
|
}
|
|
|
|
|
2018-01-21 13:46:36 +01:00
|
|
|
interface SimpleHttpClient {
|
2018-01-12 10:01:25 +01:00
|
|
|
var currentCallCallback : CurrentCallCallback?
|
2018-09-01 02:49:57 +02:00
|
|
|
|
|
|
|
fun getResponse(
|
|
|
|
request : Request,
|
|
|
|
tmpOkhttpClient : OkHttpClient? = null
|
|
|
|
) : Response
|
|
|
|
|
2018-02-06 21:41:30 +01:00
|
|
|
fun getWebSocket(
|
|
|
|
request : Request,
|
|
|
|
webSocketListener : WebSocketListener
|
|
|
|
) : WebSocket
|
2018-01-12 10:01:25 +01:00
|
|
|
}
|
|
|
|
|
2018-02-06 21:41:30 +01:00
|
|
|
class SimpleHttpClientImpl(
|
|
|
|
context : Context,
|
2018-09-01 02:49:57 +02:00
|
|
|
private val okHttpClient : OkHttpClient
|
2018-02-06 21:41:30 +01:00
|
|
|
) : SimpleHttpClient {
|
|
|
|
|
2018-09-01 02:49:57 +02:00
|
|
|
|
2018-02-06 21:41:30 +01:00
|
|
|
companion object {
|
|
|
|
val log = LogCategory("SimpleHttpClientImpl")
|
|
|
|
var connectivityManager : ConnectivityManager? = null
|
|
|
|
}
|
|
|
|
|
|
|
|
init {
|
|
|
|
if(connectivityManager == null) {
|
|
|
|
connectivityManager =
|
|
|
|
context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-12 10:01:25 +01:00
|
|
|
override var currentCallCallback : CurrentCallCallback? = null
|
|
|
|
|
2018-09-01 02:49:57 +02:00
|
|
|
override fun getResponse(
|
|
|
|
request : Request,
|
|
|
|
tmpOkhttpClient : OkHttpClient?
|
|
|
|
) : Response {
|
2018-02-06 21:41:30 +01:00
|
|
|
checkNetworkState()
|
2018-09-01 02:49:57 +02:00
|
|
|
val call = (tmpOkhttpClient ?: this.okHttpClient).newCall(request)
|
2018-01-12 10:01:25 +01:00
|
|
|
currentCallCallback?.onCallCreated(call)
|
|
|
|
return call.execute()
|
|
|
|
}
|
|
|
|
|
2018-01-21 13:46:36 +01:00
|
|
|
override fun getWebSocket(
|
|
|
|
request : Request,
|
|
|
|
webSocketListener : WebSocketListener
|
|
|
|
) : WebSocket {
|
2018-02-06 21:41:30 +01:00
|
|
|
checkNetworkState()
|
2018-01-21 13:46:36 +01:00
|
|
|
return okHttpClient.newWebSocket(request, webSocketListener)
|
2018-01-12 10:01:25 +01:00
|
|
|
}
|
2018-02-06 21:41:30 +01:00
|
|
|
|
|
|
|
private fun checkNetworkState() {
|
|
|
|
|
|
|
|
val cm = connectivityManager
|
|
|
|
if(cm == null) {
|
|
|
|
log.d("missing ConnectivityManager")
|
|
|
|
} else {
|
|
|
|
val networkInfo = cm.activeNetworkInfo
|
|
|
|
?: throw RuntimeException("missing ActiveNetwork")
|
|
|
|
|
|
|
|
val state = networkInfo.state
|
|
|
|
val detailedState = networkInfo.detailedState
|
|
|
|
if(! networkInfo.isConnected) {
|
|
|
|
throw RuntimeException("network not ready. state=$state detail=$detailedState")
|
|
|
|
}
|
|
|
|
if(state == NetworkInfo.State.CONNECTED && detailedState == NetworkInfo.DetailedState.CONNECTED) {
|
|
|
|
// no logging
|
|
|
|
} else {
|
|
|
|
log.d("checkNetworkState state=$state detail=$detailedState")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-12 10:01:25 +01:00
|
|
|
}
|
|
|
|
|
2018-02-06 21:41:30 +01:00
|
|
|
|