package com.RSen.Commandr.core;
import android.os.Bundle;
import android.support.annotation.NonNull;
import com.seebye.messengerapi.api.AbstractBroadcastReceiver;
import com.seebye.messengerapi.api.constants.Action;
import com.seebye.messengerapi.api.constants.ResponseType;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Seebye on 22.04.2015.
* This file is needed for the communication between Commandr and Seebye Messenger API
*/
public class MAPIReceiver extends AbstractBroadcastReceiver
{
private static final ConcurrentHashMap<Object, ConcurrentHashMap<Long, ResponseCallback>> s_mapCallbacks = new ConcurrentHashMap<>();
@Override
protected void onResponseReceived(long lBroadcastID, int nRequestActionID, @NonNull ResponseType responseType, @NonNull Action action, @NonNull Bundle extras)
{
executeCallbacks(lBroadcastID, nRequestActionID, responseType, action, extras);
}
private void executeCallbacks(long lBroadcastID, int nRequestActionID, @NonNull ResponseType responseType, @NonNull Action action, @NonNull Bundle extras)
{
synchronized(s_mapCallbacks)
{
Set<Object> aObjKeys = s_mapCallbacks.keySet();
Iterator<Object> i = aObjKeys.iterator();
Object obj;
ConcurrentHashMap<Long, ResponseCallback> mapCallbacks;
ResponseCallback responseCallback;
while(i.hasNext())
{
obj = i.next();
mapCallbacks = s_mapCallbacks.get(obj);
responseCallback = mapCallbacks.remove(lBroadcastID);
if(responseCallback != null)
{
responseCallback.onResponseReceived(lBroadcastID, nRequestActionID, responseType, action, extras);
}
if(mapCallbacks.isEmpty())
{
i.remove();
}
}
}
}
public static void registerRequest(@NonNull Object objOwner, long lBroadcastID, @NonNull ResponseCallback callback)
{
synchronized(s_mapCallbacks)
{
ConcurrentHashMap<Long, ResponseCallback> callbacks = s_mapCallbacks.get(objOwner);
if(callbacks == null)
{
callbacks = new ConcurrentHashMap<>();
s_mapCallbacks.put(objOwner, callbacks);
}
callbacks.put(lBroadcastID, callback);
}
}
public static void unregisterAllRequest(@NonNull Object objOwner)
{
synchronized(s_mapCallbacks)
{
s_mapCallbacks.remove(objOwner);
}
}
public static interface ResponseCallback
{
public void onResponseReceived(long lBroadcastID, int nRequestActionID, @NonNull ResponseType responseType, @NonNull Action action, @NonNull Bundle extras);
}
}