pub fn on_hover_event<H: ActivationHandler + ?Sized>(
        &mut self,
        activation_handler: &mut H,
        action: jint,
        x: jfloat,
        y: jfloat,
    ) -> Option<QueuedEvents> {
        let mut events = Vec::new();
        match action {
            MOTION_ACTION_HOVER_ENTER | MOTION_ACTION_HOVER_MOVE => {
                let new_id = self.virtual_view_at_point(activation_handler, x, y);
                if self.hover_target != new_id {
                    if let Some(virtual_view_id) = new_id {
                        events.push(QueuedEvent::Simple {
                            virtual_view_id,
                            event_type: EVENT_VIEW_HOVER_ENTER,
                        });
                    }
                    if let Some(virtual_view_id) = self.hover_target {
                        events.push(QueuedEvent::Simple {
                            virtual_view_id,
                            event_type: EVENT_VIEW_HOVER_EXIT,
                        });
                    }
                    self.hover_target = new_id;
                }
            }
            MOTION_ACTION_HOVER_EXIT => {
                if let Some(virtual_view_id) = self.hover_target.take() {
                    events.push(QueuedEvent::Simple {
                        virtual_view_id,
                        event_type: EVENT_VIEW_HOVER_EXIT,
                    });
                }
            }
            _ => return None,
        }
        Some(QueuedEvents(events))
    }
Handle the provided hover event.

The `action`, `x`, and `y` parameters must be retrieved from
the corresponding properties on an Android motion event. These
parameters are passed individually so you can use either a Java
or NDK event.

If a [`QueuedEvents`] instance is returned, the caller must call
[`QueuedEvents::raise`] on it, and if using Java, the event handler
must return `true`. Otherwise, if using Java, the event handler
must either handle the event some other way or return `false`.

This method may be safely called on any thread, but refer to
[`QueuedEvents::raise`] for restrictions on the context in which
it should be called.
platforms/android/src/adapter.rs