/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.uimanager.events;
import com.facebook.react.common.SystemClock;
/**
* A UI event that can be dispatched to JS.
*
* For dispatching events {@link EventDispatcher#dispatchEvent} should be used. Once event object
* is passed to the EventDispatched it should no longer be used as EventDispatcher may decide
* to recycle that object (by calling {@link #dispose}).
*/
public abstract class Event<T extends Event> {
private static int sUniqueID = 0;
private boolean mInitialized;
private int mViewTag;
private long mTimestampMs;
private int mUniqueID = sUniqueID++;
protected Event() {
}
protected Event(int viewTag) {
init(viewTag);
}
/**
* This method needs to be called before event is sent to event dispatcher.
*/
protected void init(int viewTag) {
mViewTag = viewTag;
mTimestampMs = SystemClock.uptimeMillis();
mInitialized = true;
}
/**
* @return the view id for the view that generated this event
*/
public final int getViewTag() {
return mViewTag;
}
/**
* @return the time at which the event happened in the {@link android.os.SystemClock#uptimeMillis}
* base.
*/
public final long getTimestampMs() {
return mTimestampMs;
}
/**
* @return false if this Event can *never* be coalesced
*/
public boolean canCoalesce() {
return true;
}
/**
* Given two events, coalesce them into a single event that will be sent to JS instead of two
* separate events. By default, just chooses the one the is more recent, or {@code this} if timestamps are the same.
*
* Two events will only ever try to be coalesced if they have the same event name, view id, and
* coalescing key.
*/
public T coalesce(T otherEvent) {
return (T) (getTimestampMs() >= otherEvent.getTimestampMs() ? this : otherEvent);
}
/**
* @return a key used to determine which other events of this type this event can be coalesced
* with. For example, touch move events should only be coalesced within a single gesture so a
* coalescing key there would be the unique gesture id.
*/
public short getCoalescingKey() {
return 0;
}
/**
* @return The unique id of this event.
*/
public int getUniqueID() {
return mUniqueID;
}
/**
* Called when the EventDispatcher is done with an event, either because it was dispatched or
* because it was coalesced with another Event.
*/
public void onDispose() {
}
/*package*/ boolean isInitialized() {
return mInitialized;
}
/*package*/ final void dispose() {
mInitialized = false;
onDispose();
}
/**
* @return the name of this event as registered in JS
*/
public abstract String getEventName();
/**
* Dispatch this event to JS using the given event emitter.
*/
public abstract void dispatch(RCTEventEmitter rctEventEmitter);
}