gecko/mobile/android/base/util/EventDispatcher.java
Brian Nicholson bbfab44dd6 Bug 837042 - Remove gecko property from sendMessageToJava. r=mfinkle
--HG--
extra : rebase_source : 49a739f7550a3afe83b19518833de03a014e2a80
2013-02-01 17:36:38 -08:00

95 lines
3.4 KiB
Java

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.util;
import org.json.JSONObject;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
public final class EventDispatcher {
private static final String LOGTAG = "EventDispatcher";
private final Map<String, CopyOnWriteArrayList<GeckoEventListener>> mEventListeners
= new HashMap<String, CopyOnWriteArrayList<GeckoEventListener>>();
public void registerEventListener(String event, GeckoEventListener listener) {
synchronized (mEventListeners) {
CopyOnWriteArrayList<GeckoEventListener> listeners = mEventListeners.get(event);
if (listeners == null) {
// create a CopyOnWriteArrayList so that we can modify it
// concurrently with iterating through it in handleGeckoMessage.
// Otherwise we could end up throwing a ConcurrentModificationException.
listeners = new CopyOnWriteArrayList<GeckoEventListener>();
} else if (listeners.contains(listener)) {
Log.w(LOGTAG, "EventListener already registered for event \"" + event + "\"",
new IllegalArgumentException());
}
listeners.add(listener);
mEventListeners.put(event, listeners);
}
}
public void unregisterEventListener(String event, GeckoEventListener listener) {
synchronized (mEventListeners) {
CopyOnWriteArrayList<GeckoEventListener> listeners = mEventListeners.get(event);
if (listeners == null) {
return;
}
listeners.remove(listener);
if (listeners.size() == 0) {
mEventListeners.remove(event);
}
}
}
public String dispatchEvent(String message) {
// {
// "type": "value",
// "event_specific": "value",
// ...
try {
JSONObject json = new JSONObject(message);
if (json.has("gecko")) {
Log.w(LOGTAG, "The 'gecko' property of the sendMessageToJava parameter is deprecated.");
json = json.getJSONObject("gecko");
}
String type = json.getString("type");
CopyOnWriteArrayList<GeckoEventListener> listeners;
synchronized (mEventListeners) {
listeners = mEventListeners.get(type);
}
if (listeners == null)
return "";
String response = null;
for (GeckoEventListener listener : listeners) {
listener.handleMessage(type, json);
if (listener instanceof GeckoEventResponder) {
String newResponse = ((GeckoEventResponder)listener).getResponse();
if (response != null && newResponse != null) {
Log.e(LOGTAG, "Received two responses for message of type " + type);
}
response = newResponse;
}
}
if (response != null)
return response;
} catch (Exception e) {
Log.e(LOGTAG, "handleGeckoMessage throws " + e, e);
}
return "";
}
}