package org.jboss.errai.demo.mobile.client.local; import javax.enterprise.event.Event; import org.jboss.errai.demo.mobile.client.shared.OrientationEvent; public abstract class OrientationDetector { /** * Don't try to fire a CDI OrientationEvent event more than once every 250ms. * <p> * TODO we should remove this once the bus supports coalescing events! */ private long minEventInterval = 175; /** * The time we last fired an OrientationEvent. * <p> * TODO we should remove this once the bus supports coalescing events! */ private long lastEventFireTime; protected Event<OrientationEvent> orientationEventSource; /** * Should be set by the main application when the username is set or updated. */ private String clientId = "Anonymous"; /** * Stops the periodic firing of CDI OrientationEvents. If this detector was * already in the stopped state, calling this method has no effect. */ public abstract void stopFiringOrientationEvents(); /** * Starts the periodic firing of CDI OrientationEvents. If this detector was * already in the started state, calling this method has no effect. */ public abstract void startFiringOrientationEvents(); /** * Fires an {@link OrientationEvent} with the given parameters. This method is * meant to be called by the browser-specific logic that detects the device * orientation. */ protected void fireOrientationEvent(double x, double y, double z) { long now = System.currentTimeMillis(); if (now - lastEventFireTime < minEventInterval) { return; } lastEventFireTime = now; orientationEventSource.fire(new OrientationEvent(clientId, x, y, z)); } /** * The provider class that creates the detector calls this method to give us a * means of firing the event. */ void setOrientationEventSource(Event<OrientationEvent> orientationEventSource) { this.orientationEventSource = orientationEventSource; } /** * Sets the client ID (user name) that should be included with all orientation * events fired. * * @param clientId The client ID to use. Not null. */ public void setClientId(String clientId) { if (clientId == null) throw new NullPointerException(); this.clientId = clientId; } /** * Returns true if this detector can be started. Some detectors (for example, * PhoneGap) need to wait for subsystems to start before they can begin firing * orientation events. * <p> * TODO: we won't need this when client code can participate in Errai VoteForInit. */ public abstract boolean isReady(); }