Bug 1322586 - 1. Add "always listen" option for GeckoViewHandler; r=esawin
It would be nice to reuse GeckoViewHandler for delegates too (e.g. for
the new PermissionDelegate), but delegates need to always listen to
their events. This patch adds an "always listen" option for
GeckoViewHandler that still keeps track of the current listener/delegate
instance, but registers for all events at initialization rather than
only when there is a listener.
MozReview-Commit-ID: JtskpZMy9T4
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoViewHandler.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoViewHandler.java
@@ -15,45 +15,66 @@ import android.util.Log;
/* package */ abstract class GeckoViewHandler<Listener>
implements BundleEventListener {
private static final String LOGTAG = "GeckoViewHandler";
private static final boolean DEBUG = false;
private Listener mListener;
+ private final boolean mAlwaysListen;
private final String mModuleName;
private final String[] mEvents;
+
GeckoViewHandler(final String module, final GeckoView view,
final String[] events) {
+ this(module, view, events, /* alwaysListen */ false);
+ }
+
+ GeckoViewHandler(final String module, final GeckoView view,
+ final String[] events, final boolean alwaysListen) {
+ mAlwaysListen = alwaysListen;
mModuleName = module;
mEvents = events;
+
+ if (alwaysListen) {
+ register(view.getEventDispatcher());
+ }
}
public Listener getListener() {
return mListener;
}
public void setListener(final Listener listener, final GeckoView view) {
final EventDispatcher eventDispatcher = view.getEventDispatcher();
+ if (mListener == listener) {
+ return;
+ }
- if (mListener != null && mListener != listener) {
- final GeckoBundle msg = new GeckoBundle(1);
- msg.putString("module", mModuleName);
- eventDispatcher.dispatch("GeckoView:Unregister", msg);
- eventDispatcher.unregisterUiThreadListener(this, mEvents);
+ if (!mAlwaysListen && mListener != null) {
+ unregister(eventDispatcher);
}
mListener = listener;
- if (mListener == null) {
- return;
+ if (!mAlwaysListen && mListener != null) {
+ register(eventDispatcher);
}
+ }
+ private void unregister(final EventDispatcher eventDispatcher) {
+ final GeckoBundle msg = new GeckoBundle(1);
+ msg.putString("module", mModuleName);
+ eventDispatcher.dispatch("GeckoView:Unregister", msg);
+ eventDispatcher.unregisterUiThreadListener(this, mEvents);
+ }
+
+ private void register(final EventDispatcher eventDispatcher) {
final GeckoBundle msg = new GeckoBundle(1);
msg.putString("module", mModuleName);
eventDispatcher.dispatch("GeckoView:Register", msg);
eventDispatcher.registerUiThreadListener(this, mEvents);
}
@Override
public void handleMessage(final String event, final GeckoBundle message,