btelman96/letsrobot-android

View on GitHub
letsrobotandroid-api/src/main/java/tv/letsrobot/android/api/EventManager.kt

Summary

Maintainability
A
0 mins
Test Coverage
package tv.letsrobot.android.api

import android.util.Log

/**
 * Event Manager for controls
 *
 * Subscribe to this to get raw input events from buttons on the LetsRobot platform
 *
 * For example, the default forward button outputs 'F', so we will use this code
 *
 * {
 *
 * ...
 *
 * <br>
 *
 * ``` EventManager.subscribe("F", onForward) ```
 * <br>
 *
 * ...
 *
 * }
 *
 * A more thorough example can be seen in SabertoothMotorProtocol.kt
 */
class EventManager{
    companion object {
        private val subscribers = HashMap<String, ArrayList<(Any?) -> Unit>>()
        private val globalListener = ArrayList<(String, Any?) -> Unit>()

        /**
         * Subscribe to a control
         */
        fun subscribe(event : String, listener: (Any?) -> Unit){
            var list = subscribers[event]
            if(list == null)
                list = ArrayList()
            if(!list.contains(listener))
                list.add(listener)
            subscribers[event] = list
        }

        fun subscribe(listener: (String, Any?) -> Unit){
            if(!globalListener.contains(listener))
                globalListener.add(listener)
        }

        fun unsubscribe(listener: (String, Any?) -> Unit){
            globalListener.remove(listener)
        }

        /**
         * unsubscribe from a control
         */
        fun unsubscribe(event : String, listener: (Any?) -> Unit){
            subscribers[event]?.remove(listener)
        }

        /**
         * Call a control event. Open to be called anywhere,
         * but mainly used by the ControlSocketComponent
         */
        fun invoke(event: String, message : Any? = null){
            val list = subscribers[event]
            Log.d("invoke", "$event : ${message.toString()}")
            list?.let {
                //Loop through subscribers
                it.forEach {
                    try {
                        it(message)
                    } catch (e: Exception) {
                    }
                }
            }
            globalListener.forEach{
                try {
                    it(event, message)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }
    }
}