package net.rdrei.android.mediator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import android.os.Message;
/**
* A simple message queue net.rdrei.android.mediator, that collects messages
* until the receiver is ready to process them.
*
* Messages are standard Android message, so we can leverage the efficient
* recycling process. However, we don't reuse any of the Handler infrastructure,
* so be sure not to attach it to one by accident.
*
* @author pascal
*
*/
public class MessageMediator {
private final Map<String, MessageMediator.Receiver> mReceiverRegistry;
public MessageMediator() {
mReceiverRegistry = new HashMap<String, MessageMediator.Receiver>();
}
/**
* Register a new handler for a given, unique key.
*
* @param key
* @param receiver
*/
public void register(final String key,
final MessageMediator.Receiver receiver) {
mReceiverRegistry.put(key, receiver);
}
public void send(final String key, final Message message) {
final Receiver receiver = mReceiverRegistry.get(key);
receiver.dispatch(message);
}
public static class Receiver {
private final Queue<Message> mQueue;
private boolean mIsAccepting = false;
private Handler mHandler;
public Receiver() {
mQueue = new LinkedList<Message>();
}
public void setHandler(final Handler handler) {
mHandler = handler;
}
public void accept() {
mIsAccepting = true;
sendAll();
}
public void dispatch(final Message message) {
if (mIsAccepting) {
send(message);
} else {
mQueue.add(message);
}
}
private void sendAll() {
for (final Message message : mQueue) {
send(message);
}
}
private void send(final Message message) {
if (mHandler == null) {
throw new NullPointerException(
"There was no Message Receive Handler provided!");
}
mHandler.handleMessage(message);
message.recycle();
}
}
public interface Handler {
void handleMessage(Message message);
}
}