910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/events/android/motion_event_android_source_java.h"

#include "base/android/jni_android.h"
#include "base/memory/ptr_util.h"
#include "ui/events/android/events_android_utils.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "ui/events/motionevent_jni_headers/MotionEvent_jni.h"

using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;

namespace ui {

// static
std::unique_ptr<MotionEventAndroidSource> MotionEventAndroidSourceJava::Create(
    const base::android::JavaRef<jobject>& event,
    bool is_latest_event_time_resampled) {
  return base::WrapUnique(
      new MotionEventAndroidSourceJava(event, is_latest_event_time_resampled));
}

MotionEventAndroidSourceJava::MotionEventAndroidSourceJava(
    const base::android::JavaRef<jobject>& event,
    bool is_latest_event_time_resampled)
    : event_(event),
      is_latest_event_time_resampled_(is_latest_event_time_resampled) {
  CHECK(!event_.is_null());
}

MotionEventAndroidSourceJava::~MotionEventAndroidSourceJava() = default;

int MotionEventAndroidSourceJava::GetPointerId(size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getPointerId(AttachCurrentThread(),
                                                        event_, pointer_index);
}

float MotionEventAndroidSourceJava::GetXPix(size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getX(AttachCurrentThread(), event_,
                                                pointer_index);
}

float MotionEventAndroidSourceJava::GetYPix(size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getY(AttachCurrentThread(), event_,
                                                pointer_index);
}

float MotionEventAndroidSourceJava::GetTouchMajorPix(
    size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getTouchMajor(AttachCurrentThread(),
                                                         event_, pointer_index);
}

float MotionEventAndroidSourceJava::GetTouchMinorPix(
    size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getTouchMinor(AttachCurrentThread(),
                                                         event_, pointer_index);
}

float MotionEventAndroidSourceJava::GetRawOrientation(
    size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getOrientation(
      AttachCurrentThread(), event_, pointer_index);
}

float MotionEventAndroidSourceJava::GetPressure(size_t pointer_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getPressure(AttachCurrentThread(),
                                                       event_, pointer_index);
}

float MotionEventAndroidSourceJava::GetAxisHscroll(size_t pointer_index) const {
  return Java_MotionEvent_getAxisValue(AttachCurrentThread(), event_,
                                       JNI_MotionEvent::AXIS_HSCROLL,
                                       pointer_index);
}

float MotionEventAndroidSourceJava::GetAxisVscroll(size_t pointer_index) const {
  return Java_MotionEvent_getAxisValue(AttachCurrentThread(), event_,
                                       JNI_MotionEvent::AXIS_VSCROLL,
                                       pointer_index);
}

float MotionEventAndroidSourceJava::GetRawTilt(size_t pointer_index) const {
  return Java_MotionEvent_getAxisValue(
      AttachCurrentThread(), event_, JNI_MotionEvent::AXIS_TILT, pointer_index);
}

MotionEvent::ToolType MotionEventAndroidSourceJava::GetToolType(
    size_t pointer_index) const {
  return FromAndroidToolType(JNI_MotionEvent::Java_MotionEvent_getToolType(
      AttachCurrentThread(), event_, pointer_index));
}

int MotionEventAndroidSourceJava::GetActionMasked() const {
  return JNI_MotionEvent::Java_MotionEvent_getActionMasked(
      AttachCurrentThread(), event_);
}

int MotionEventAndroidSourceJava::GetButtonState() const {
  return JNI_MotionEvent::Java_MotionEvent_getButtonState(AttachCurrentThread(),
                                                          event_);
}

base::TimeTicks MotionEventAndroidSourceJava::GetHistoricalEventTime(
    size_t historical_index) const {
  jlong time_ms = JNI_MotionEvent::Java_MotionEvent_getHistoricalEventTime(
      AttachCurrentThread(), event_, historical_index);
  return base::TimeTicks::FromUptimeMillis(time_ms);
}

float MotionEventAndroidSourceJava::GetHistoricalTouchMajorPix(
    size_t pointer_index,
    size_t historical_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getHistoricalTouchMajor(
      AttachCurrentThread(), event_, pointer_index, historical_index);
}

float MotionEventAndroidSourceJava::GetHistoricalXPix(
    size_t pointer_index,
    size_t historical_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getHistoricalX(
      AttachCurrentThread(), event_, pointer_index, historical_index);
}

float MotionEventAndroidSourceJava::GetHistoricalYPix(
    size_t pointer_index,
    size_t historical_index) const {
  return JNI_MotionEvent::Java_MotionEvent_getHistoricalY(
      AttachCurrentThread(), event_, pointer_index, historical_index);
}

bool MotionEventAndroidSourceJava::IsLatestEventTimeResampled() const {
  return is_latest_event_time_resampled_;
}

int MotionEventAndroidSourceJava::GetSource() const {
  return JNI_MotionEvent::Java_MotionEvent_getSource(AttachCurrentThread(),
                                                     event_);
}

ScopedJavaLocalRef<jobject> MotionEventAndroidSourceJava::GetJavaObject()
    const {
  return ScopedJavaLocalRef<jobject>(event_);
}

int MotionEventAndroidSourceJava::GetMetaState() const {
  return JNI_MotionEvent::Java_MotionEvent_getMetaState(AttachCurrentThread(),
                                                        event_);
}

std::unique_ptr<MotionEventAndroidSource> MotionEventAndroidSourceJava::Clone()
    const {
  return Create(event_, is_latest_event_time_resampled_);
}

}  // namespace ui