package im.actor.runtime.eventbus; import java.util.ArrayList; import java.util.HashMap; import im.actor.runtime.Log; /** * Event bus for dispatching events to various parts of application. * Not designed to heavy usage. */ public class EventBus { private HashMap<String, Event> stickyEvents = new HashMap<>(); private HashMap<BusSubscriber, SubscriberConfig> subscribers = new HashMap<>(); public synchronized void subscribe(BusSubscriber subscriber) { subscribe(subscriber, null); } public synchronized void subscribe(BusSubscriber subscriber, String eventType) { SubscriberConfig config = subscribers.get(subscriber); if (config != null) { if (!config.getTypes().contains(eventType)) { config.getTypes().add(eventType); } } else { config = new SubscriberConfig(eventType); config.getTypes().add(eventType); subscribers.put(subscriber, config); } if (eventType != null && stickyEvents.containsKey(eventType)) { subscriber.onBusEvent(stickyEvents.get(eventType)); } } public synchronized void unsubscrive(BusSubscriber subscriber) { subscribers.remove(subscriber); } public void post(final Event event) { im.actor.runtime.Runtime.dispatch(() -> deliver(event, false)); } public void postSticky(final Event event) { im.actor.runtime.Runtime.dispatch(() -> deliver(event, true)); } private synchronized void deliver(Event e, boolean isSticky) { Log.d("EventBus", "Event: " + e); String eventType = e.getType(); if (isSticky) { stickyEvents.put(eventType, e); } for (BusSubscriber s : subscribers.keySet()) { SubscriberConfig config = subscribers.get(s); if (config.getTypes().contains(null) || config.getTypes().contains(eventType)) { s.onBusEvent(e); } } } private class SubscriberConfig { private ArrayList<String> types = new ArrayList<>(); public SubscriberConfig(String baseType) { this.types.add(baseType); } public ArrayList<String> getTypes() { return types; } } }