/** * 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; /** * A UI event that can be dispatched to JS. */ public abstract class Event<T extends Event> { private final int mViewTag; private final long mTimestampMs; protected Event(int viewTag, long timestampMs) { mViewTag = viewTag; mTimestampMs = timestampMs; } /** * @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. * * 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; } /** * Called when the EventDispatcher is done with an event, either because it was dispatched or * because it was coalesced with another Event. */ public void dispose() { } /** * @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); }