/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "MotionPredictor-JNI"
#include
#include
#include "android_view_MotionEvent.h"
#include "core_jni_helpers.h"
/**
* This file is a bridge from Java to native for MotionPredictor class.
* It should be pass-through only. Do not store any state or put any business logic into this file.
*/
namespace android {
static void release(void* ptr) {
delete reinterpret_cast(ptr);
}
static jlong android_view_MotionPredictor_nativeGetNativeMotionPredictorFinalizer(JNIEnv* env,
jclass clazz) {
return reinterpret_cast(release);
}
static jlong android_view_MotionPredictor_nativeInitialize(JNIEnv* env, jclass clazz,
jint offsetNanos) {
const nsecs_t offset = static_cast(offsetNanos);
return reinterpret_cast(new MotionPredictor(offset));
}
static void android_view_MotionPredictor_nativeRecord(JNIEnv* env, jclass clazz, jlong ptr,
jobject event) {
MotionPredictor* predictor = reinterpret_cast(ptr);
MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, event);
android::base::Result result = predictor->record(*motionEvent);
if (!result.ok()) {
jniThrowException(env, "java/lang/IllegalArgumentException",
result.error().message().c_str());
}
}
static jobject android_view_MotionPredictor_nativePredict(JNIEnv* env, jclass clazz, jlong ptr,
jlong predictionTimeNanos) {
MotionPredictor* predictor = reinterpret_cast(ptr);
return android_view_MotionEvent_obtainFromNative(env,
predictor->predict(static_cast(
predictionTimeNanos)));
}
static jboolean android_view_MotionPredictor_nativeIsPredictionAvailable(JNIEnv* env, jclass clazz,
jlong ptr, jint deviceId,
jint source) {
MotionPredictor* predictor = reinterpret_cast(ptr);
return predictor->isPredictionAvailable(static_cast(deviceId),
static_cast(source));
}
// ----------------------------------------------------------------------------
static const std::array gMotionPredictorMethods{{
/* name, signature, funcPtr */
{"nativeInitialize", "(I)J", (void*)android_view_MotionPredictor_nativeInitialize},
{"nativeGetNativeMotionPredictorFinalizer", "()J",
(void*)android_view_MotionPredictor_nativeGetNativeMotionPredictorFinalizer},
{"nativeRecord", "(JLandroid/view/MotionEvent;)V",
(void*)android_view_MotionPredictor_nativeRecord},
{"nativePredict", "(JJ)Landroid/view/MotionEvent;",
(void*)android_view_MotionPredictor_nativePredict},
{"nativeIsPredictionAvailable", "(JII)Z",
(void*)android_view_MotionPredictor_nativeIsPredictionAvailable},
}};
int register_android_view_MotionPredictor(JNIEnv* env) {
return RegisterMethodsOrDie(env, "android/view/MotionPredictor", gMotionPredictorMethods.data(),
gMotionPredictorMethods.size());
}
} // namespace android