diff --git a/libraries/mogo-telematic/src/main/java/com/mogo/telematic/TelematicHandler.kt b/libraries/mogo-telematic/src/main/java/com/mogo/telematic/TelematicHandler.kt new file mode 100644 index 0000000..bcbba79 --- /dev/null +++ b/libraries/mogo-telematic/src/main/java/com/mogo/telematic/TelematicHandler.kt @@ -0,0 +1,49 @@ +package com.mogo.telematic + +import android.os.Handler +import android.os.HandlerThread +import android.os.Message + +object TelematicHandler { + + private const val MSG_DELAY = 100 + + private val handlerThread by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + HandlerThread("TelematicHandler") + } + + private var handler: Handler? = null + private var listener: ITelematicListener? = null + + @JvmStatic + fun init() { + handlerThread.start() + handler = object : Handler(handlerThread.looper) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (msg.what == MSG_DELAY) { + listener?.delayCompleted() + } + } + } + } + + @JvmStatic + fun setListener(listener: ITelematicListener) { + this.listener = listener + } + + @JvmStatic + fun delay(delayMillis: Long) { + handler?.sendEmptyMessageDelayed(MSG_DELAY, delayMillis) + } + + @JvmStatic + fun removeDelay() { + handler?.removeMessages(MSG_DELAY) + } + + interface ITelematicListener { + fun delayCompleted() + } +} \ No newline at end of file diff --git a/libraries/mogo-telematic/src/main/java/com/mogo/telematic/client/handler/HeartbeatHandler.kt b/libraries/mogo-telematic/src/main/java/com/mogo/telematic/client/handler/HeartbeatHandler.kt new file mode 100644 index 0000000..2d65344 --- /dev/null +++ b/libraries/mogo-telematic/src/main/java/com/mogo/telematic/client/handler/HeartbeatHandler.kt @@ -0,0 +1,36 @@ +package com.mogo.telematic.client.handler + +import com.mogo.telematic.client.listener.NettyClientListener +import com.mogo.telematic.client.status.ConnectState +import io.netty.buffer.Unpooled +import io.netty.channel.ChannelFuture +import io.netty.channel.ChannelHandlerContext +import io.netty.channel.ChannelInboundHandlerAdapter +import io.netty.handler.timeout.IdleStateEvent +import io.netty.util.CharsetUtil + +class HeartbeatHandler(val listener: NettyClientListener<*>): ChannelInboundHandlerAdapter() { + + private val heartbeatData by lazy { + Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.UTF_8)) + } + + override fun userEventTriggered(ctx: ChannelHandlerContext?, evt: Any?) { + if (evt is IdleStateEvent) { + ctx?.writeAndFlush(heartbeatData.duplicate())?.addListener { future -> + if (future is ChannelFuture) { + if (!future.isSuccess) { + listener.onClientStatusConnectChanged( + ConnectState.STATUS_CONNECT_CLOSED, + "channelInactive", + ctx.channel() + ) + future.channel().close() + } + } + } + } else { + super.userEventTriggered(ctx, evt) + } + } +} \ No newline at end of file