package im.actor.core.modules.eventbus;
import java.util.ArrayList;
import java.util.HashMap;
import im.actor.core.api.updates.UpdateEventBusDeviceConnected;
import im.actor.core.api.updates.UpdateEventBusDeviceDisconnected;
import im.actor.core.api.updates.UpdateEventBusDisposed;
import im.actor.core.api.updates.UpdateEventBusMessage;
import im.actor.core.modules.AbsModule;
import im.actor.core.modules.ModuleContext;
import im.actor.runtime.Log;
import im.actor.runtime.actors.ActorRef;
public class EventBusModule extends AbsModule {
private HashMap<String, ActorRef> subscribers = new HashMap<>();
private HashMap<String, ArrayList<Object>> pendingMessages = new HashMap<>();
public EventBusModule(ModuleContext context) {
super(context);
}
public void run() {
}
public synchronized void subscribe(String busId, ActorRef ref) {
subscribers.put(busId, ref);
if (pendingMessages.containsKey(busId)) {
for (Object o : pendingMessages.get(busId)) {
onEventBusUpdate(o);
}
pendingMessages.remove(busId);
}
}
public synchronized void unsubscribe(String busId, ActorRef ref) {
if (subscribers.get(busId) == ref) {
subscribers.remove(busId);
}
}
public synchronized void onEventBusUpdate(Object update) {
if (update instanceof UpdateEventBusMessage) {
UpdateEventBusMessage busMessage = (UpdateEventBusMessage) update;
ActorRef dest = subscribers.get(busMessage.getId());
if (dest != null) {
dest.send(new EventBusActor.EventBusMessage(
busMessage.getSenderId(),
busMessage.getSenderDeviceId(),
busMessage.getMessage()));
// Log.d("EVENTBUS", "Delivered");
} else {
// Log.d("EVENTBUS", "Not Delivered");
if (!pendingMessages.containsKey(busMessage.getId())) {
pendingMessages.put(busMessage.getId(), new ArrayList<>());
}
pendingMessages.get(busMessage.getId()).add(update);
}
} else if (update instanceof UpdateEventBusDeviceConnected) {
UpdateEventBusDeviceConnected deviceConnected = (UpdateEventBusDeviceConnected) update;
ActorRef dest = subscribers.get(deviceConnected.getId());
if (dest != null) {
dest.send(new EventBusActor.EventBusDeviceConnected(
deviceConnected.getUserId(),
deviceConnected.getDeviceId()));
} else {
// Log.d("EVENTBUS", "Not Delivered");
if (!pendingMessages.containsKey(deviceConnected.getId())) {
pendingMessages.put(deviceConnected.getId(), new ArrayList<>());
}
pendingMessages.get(deviceConnected.getId()).add(update);
}
} else if (update instanceof UpdateEventBusDeviceDisconnected) {
UpdateEventBusDeviceDisconnected deviceDisconnected = (UpdateEventBusDeviceDisconnected) update;
ActorRef dest = subscribers.get(deviceDisconnected.getId());
if (dest != null) {
dest.send(new EventBusActor.EventBusDeviceDisconnected(deviceDisconnected.getUserId(),
deviceDisconnected.getDeviceId()));
} else {
Log.d("EVENTBUS", "Not Delivered");
if (!pendingMessages.containsKey(deviceDisconnected.getId())) {
pendingMessages.put(deviceDisconnected.getId(), new ArrayList<>());
}
pendingMessages.get(deviceDisconnected.getId()).add(update);
}
} else if (update instanceof UpdateEventBusDisposed) {
UpdateEventBusDisposed disposed = (UpdateEventBusDisposed) update;
ActorRef dest = subscribers.get(disposed.getId());
if (dest != null) {
dest.send(new EventBusActor.EventBusDisposed());
} else {
// Log.d("EVENTBUS", "Not Delivered");
if (!pendingMessages.containsKey(disposed.getId())) {
pendingMessages.put(disposed.getId(), new ArrayList<>());
}
pendingMessages.get(disposed.getId()).add(update);
}
}
}
}