| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_ANDROID_EVENT_FORWARDER_H_ |
| #define UI_ANDROID_EVENT_FORWARDER_H_ |
| |
| #include "base/android/scoped_java_ref.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/observer_list.h" |
| #include "ui/android/ui_android_export.h" |
| |
| namespace ui { |
| |
| class MotionEventAndroid; |
| class ViewAndroid; |
| |
| class UI_ANDROID_EXPORT EventForwarder { |
| public: |
| // Interface for observing events on the `EventForwarder`. |
| class Observer : public base::CheckedObserver { |
| public: |
| ~Observer() override = default; |
| |
| virtual void OnTouchEvent(const ui::MotionEventAndroid&) {} |
| |
| virtual void OnMouseEvent(const ui::MotionEventAndroid&) {} |
| |
| virtual void OnGenericMotionEvent(const ui::MotionEventAndroid&) {} |
| }; |
| |
| EventForwarder(const EventForwarder&) = delete; |
| EventForwarder& operator=(const EventForwarder&) = delete; |
| |
| ~EventForwarder(); |
| |
| base::android::ScopedJavaLocalRef<jobject> GetJavaWindowAndroid( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj); |
| |
| // |oldest_event_time| and |latest_event_time| would be same for a MotionEvent |
| // without any historical events attached to it. For cases when there are |
| // historical events |oldest_event_time| will be the event time of earliest |
| // input i.e. MotionEvent.getHistoricalEventTimeNanos(0) and |
| // |latest_event_time| will be the event time of most recent event i.e. |
| // MotionEvent.getEventTimeNanos(). |
| jboolean OnTouchEvent( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| const base::android::JavaParamRef<jobject>& motion_event, |
| jlong oldest_event_time_ns, |
| jlong latest_event_time_ns, |
| jint android_action, |
| jint pointer_count, |
| jint history_size, |
| jint action_index, |
| jfloat pos_x_0, |
| jfloat pos_y_0, |
| jfloat pos_x_1, |
| jfloat pos_y_1, |
| jint pointer_id_0, |
| jint pointer_id_1, |
| jfloat touch_major_0, |
| jfloat touch_major_1, |
| jfloat touch_minor_0, |
| jfloat touch_minor_1, |
| jfloat orientation_0, |
| jfloat orientation_1, |
| jfloat tilt_0, |
| jfloat tilt_1, |
| jfloat raw_pos_x, |
| jfloat raw_pos_y, |
| jint android_tool_type_0, |
| jint android_tool_type_1, |
| jint android_gesture_classification, |
| jint android_button_state, |
| jint android_meta_state, |
| jboolean is_touch_handle_event); |
| |
| void OnMouseEvent(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| jlong time_ns, |
| jint android_action, |
| jfloat x, |
| jfloat y, |
| jint pointer_id, |
| jfloat pressure, |
| jfloat orientation, |
| jfloat tilt, |
| jint android_changed_button, |
| jint android_button_state, |
| jint android_meta_state, |
| jint tool_type); |
| |
| void OnDragEvent(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jint action, |
| jfloat x, |
| jfloat y, |
| jfloat screen_x, |
| jfloat screen_y, |
| const base::android::JavaParamRef<jobjectArray>& j_mimeTypes, |
| const base::android::JavaParamRef<jstring>& j_content); |
| |
| jboolean OnGestureEvent(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jint type, |
| jlong time_ms, |
| jfloat scale); |
| |
| jboolean OnGenericMotionEvent( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| const base::android::JavaParamRef<jobject>& motion_event, |
| jlong time_ns); |
| |
| jboolean OnKeyUp(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| const base::android::JavaParamRef<jobject>& key_event, |
| jint key_code); |
| |
| jboolean DispatchKeyEvent( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| const base::android::JavaParamRef<jobject>& motion_event); |
| |
| void ScrollBy(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jfloat delta_x, |
| jfloat delta_y); |
| |
| void ScrollTo(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jfloat x, |
| jfloat y); |
| |
| void DoubleTap(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jlong time_ms, |
| jint x, |
| jint y); |
| |
| void StartFling(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jlong time_ms, |
| jfloat velocity_x, |
| jfloat velocity_y, |
| jboolean synthetic_scroll, |
| jboolean prevent_boosting); |
| |
| void CancelFling(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& jobj, |
| jlong time_ms, |
| jboolean prevent_boosting); |
| |
| void AddObserver(Observer* observer); |
| |
| void RemoveObserver(Observer* observer); |
| |
| private: |
| friend class ViewAndroid; |
| |
| explicit EventForwarder(ViewAndroid* view); |
| |
| base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); |
| |
| // last_x_pos_ & last_y_pos_ are only used for trace events (see b/315762684 |
| // for a relevant investigation). They are useful in debugging but could be |
| // removed easily if needed. |
| float last_x_pos_{-1.0}; |
| float last_y_pos_{-1.0}; |
| const raw_ptr<ViewAndroid> view_; |
| base::android::ScopedJavaGlobalRef<jobject> java_obj_; |
| |
| base::ObserverList<Observer> observers_; |
| bool send_touch_moves_to_observers; |
| }; |
| |
| } // namespace ui |
| |
| #endif // UI_ANDROID_EVENT_FORWARDER_H_ |