diff --git a/app/src/main/kotlin/com/github/gotify/MissedMessageUtil.kt b/app/src/main/kotlin/com/github/gotify/MissedMessageUtil.kt index cf6719e..3a69759 100644 --- a/app/src/main/kotlin/com/github/gotify/MissedMessageUtil.kt +++ b/app/src/main/kotlin/com/github/gotify/MissedMessageUtil.kt @@ -3,20 +3,19 @@ package com.github.gotify import com.github.gotify.api.Api import com.github.gotify.api.ApiException import com.github.gotify.api.Callback -import com.github.gotify.api.Callback.SuccessCallback import com.github.gotify.client.api.MessageApi import com.github.gotify.client.model.Message import com.github.gotify.log.Log internal class MissedMessageUtil(private val api: MessageApi) { - fun lastReceivedMessage(successCallback: SuccessCallback) { + fun lastReceivedMessage(acceptID: (Long) -> Unit) { api.getMessages(1, 0L).enqueue( Callback.call( - onSuccess = { messages -> + onSuccess = Callback.SuccessBody { messages -> if (messages.messages.size == 1) { - successCallback.onSuccess(messages.messages[0].id) + acceptID(messages.messages[0].id) } else { - successCallback.onSuccess(NO_MESSAGES) + acceptID(NO_MESSAGES) } }, onError = {} diff --git a/app/src/main/kotlin/com/github/gotify/api/Api.kt b/app/src/main/kotlin/com/github/gotify/api/Api.kt index ac8ebc3..7b09a5a 100644 --- a/app/src/main/kotlin/com/github/gotify/api/Api.kt +++ b/app/src/main/kotlin/com/github/gotify/api/Api.kt @@ -4,6 +4,19 @@ import retrofit2.Call import java.io.IOException internal object Api { + @Throws(ApiException::class) + fun execute(call: Call) { + try { + val response = call.execute() + + if (!response.isSuccessful) { + throw ApiException(response) + } + } catch (e: IOException) { + throw ApiException(e) + } + } + @Throws(ApiException::class) fun execute(call: Call): T { try { diff --git a/app/src/main/kotlin/com/github/gotify/api/Callback.kt b/app/src/main/kotlin/com/github/gotify/api/Callback.kt index 14f0785..8c1e1c8 100644 --- a/app/src/main/kotlin/com/github/gotify/api/Callback.kt +++ b/app/src/main/kotlin/com/github/gotify/api/Callback.kt @@ -10,7 +10,15 @@ internal class Callback private constructor( private val onError: ErrorCallback ) { fun interface SuccessCallback { - fun onSuccess(data: T) + fun onSuccess(response: Response) + } + + fun interface SuccessBody : SuccessCallback { + override fun onSuccess(response: Response) { + onResultSuccess(response.body() ?: throw ApiException("null response", response)) + } + + fun onResultSuccess(data: T) } fun interface ErrorCallback { @@ -20,9 +28,7 @@ internal class Callback private constructor( private class RetrofitCallback(private val callback: Callback) : retrofit2.Callback { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { - callback.onSuccess.onSuccess( - response.body() ?: throw ApiException("null response", response) - ) + callback.onSuccess.onSuccess(response) } else { callback.onError.onError(ApiException(response)) } @@ -40,19 +46,12 @@ internal class Callback private constructor( onError: ErrorCallback ): retrofit2.Callback { return call( - onSuccess = { data -> context.runOnUiThread { onSuccess.onSuccess(data) } }, + onSuccess = { response -> context.runOnUiThread { onSuccess.onSuccess(response) } }, onError = { exception -> context.runOnUiThread { onError.onError(exception) } } ) } - fun call(): retrofit2.Callback { - return call( - onSuccess = {}, - onError = {} - ) - } - - fun call(onSuccess: SuccessCallback, onError: ErrorCallback): retrofit2.Callback { + fun call(onSuccess: SuccessCallback = SuccessCallback {}, onError: ErrorCallback = ErrorCallback {}): retrofit2.Callback { return RetrofitCallback(merge(of(onSuccess, onError), errorCallback())) } diff --git a/app/src/main/kotlin/com/github/gotify/init/InitializationActivity.kt b/app/src/main/kotlin/com/github/gotify/init/InitializationActivity.kt index 5083439..6e56ba7 100644 --- a/app/src/main/kotlin/com/github/gotify/init/InitializationActivity.kt +++ b/app/src/main/kotlin/com/github/gotify/init/InitializationActivity.kt @@ -63,7 +63,7 @@ internal class InitializationActivity : AppCompatActivity() { .enqueue( Callback.callInUI( this, - onSuccess = { user -> authenticated(user) }, + onSuccess = Callback.SuccessBody { user -> authenticated(user) }, onError = { exception -> failed(exception) } ) ) @@ -113,7 +113,7 @@ internal class InitializationActivity : AppCompatActivity() { private fun requestVersion(runnable: Runnable) { requestVersion( - callback = { version: VersionInfo -> + callback = Callback.SuccessBody { version: VersionInfo -> Log.i("Server version: ${version.version}@${version.buildDate}") settings.serverVersion = version.version runnable.run() diff --git a/app/src/main/kotlin/com/github/gotify/login/LoginActivity.kt b/app/src/main/kotlin/com/github/gotify/login/LoginActivity.kt index a86f75e..ed84f7b 100644 --- a/app/src/main/kotlin/com/github/gotify/login/LoginActivity.kt +++ b/app/src/main/kotlin/com/github/gotify/login/LoginActivity.kt @@ -192,7 +192,7 @@ internal class LoginActivity : AppCompatActivity() { } private fun onValidUrl(url: String): SuccessCallback { - return SuccessCallback { version -> + return Callback.SuccessBody { version -> settings.url = url binding.checkurlProgress.visibility = View.GONE binding.checkurl.visibility = View.VISIBLE @@ -261,7 +261,7 @@ internal class LoginActivity : AppCompatActivity() { .enqueue( Callback.callInUI( this, - onSuccess = { client -> onCreatedClient(client) }, + onSuccess = Callback.SuccessBody { client -> onCreatedClient(client) }, onError = { onFailedToCreateClient() } ) ) diff --git a/app/src/main/kotlin/com/github/gotify/messages/provider/ApplicationHolder.kt b/app/src/main/kotlin/com/github/gotify/messages/provider/ApplicationHolder.kt index 0f03ab8..68e5c41 100644 --- a/app/src/main/kotlin/com/github/gotify/messages/provider/ApplicationHolder.kt +++ b/app/src/main/kotlin/com/github/gotify/messages/provider/ApplicationHolder.kt @@ -20,7 +20,7 @@ internal class ApplicationHolder(private val activity: Activity, private val cli .enqueue( Callback.callInUI( activity, - onSuccess = { apps -> onReceiveApps(apps) }, + onSuccess = Callback.SuccessBody { apps -> onReceiveApps(apps) }, onError = { onFailedApps() } ) ) diff --git a/app/src/main/kotlin/com/github/gotify/picasso/PicassoHandler.kt b/app/src/main/kotlin/com/github/gotify/picasso/PicassoHandler.kt index a1e356a..2ece693 100644 --- a/app/src/main/kotlin/com/github/gotify/picasso/PicassoHandler.kt +++ b/app/src/main/kotlin/com/github/gotify/picasso/PicassoHandler.kt @@ -68,7 +68,7 @@ internal class PicassoHandler(private val context: Context, private val settings .apps .enqueue( Callback.call( - onSuccess = { apps -> + onSuccess = Callback.SuccessBody { apps -> appIdToAppImage.clear() appIdToAppImage.putAll(MessageImageCombiner.appIdToImage(apps)) }, diff --git a/app/src/main/kotlin/com/github/gotify/service/WebSocketConnection.kt b/app/src/main/kotlin/com/github/gotify/service/WebSocketConnection.kt index dfac6cb..b76605e 100644 --- a/app/src/main/kotlin/com/github/gotify/service/WebSocketConnection.kt +++ b/app/src/main/kotlin/com/github/gotify/service/WebSocketConnection.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import com.github.gotify.SSLSettings import com.github.gotify.Utils -import com.github.gotify.api.Callback.SuccessCallback import com.github.gotify.api.CertUtils import com.github.gotify.client.model.Message import com.github.gotify.log.Log @@ -38,7 +37,7 @@ internal class WebSocketConnection( private var errorCount = 0 private var webSocket: WebSocket? = null - private lateinit var onMessage: SuccessCallback + private lateinit var onMessageCallback: (Message) -> Unit private lateinit var onClose: Runnable private lateinit var onOpen: Runnable private lateinit var onBadRequest: BadRequestRunnable @@ -56,8 +55,8 @@ internal class WebSocketConnection( } @Synchronized - fun onMessage(onMessage: SuccessCallback): WebSocketConnection { - this.onMessage = onMessage + fun onMessage(onMessage: (Message) -> Unit): WebSocketConnection { + this.onMessageCallback = onMessage return this } @@ -168,7 +167,7 @@ internal class WebSocketConnection( syncExec { Log.i("WebSocket($id): received message $text") val message = Utils.JSON.fromJson(text, Message::class.java) - onMessage.onSuccess(message) + onMessageCallback(message) } super.onMessage(webSocket, text) }