1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2024 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Worker #define LOG_TAG "NativeMonkey"
18*90c8c64dSAndroid Build Coastguard Worker
19*90c8c64dSAndroid Build Coastguard Worker #include <aidl/com/android/commands/monkey/BnMonkey.h>
20*90c8c64dSAndroid Build Coastguard Worker #include <android-base/logging.h>
21*90c8c64dSAndroid Build Coastguard Worker #include <android/binder_ibinder_jni.h>
22*90c8c64dSAndroid Build Coastguard Worker #include <input/VirtualInputDevice.h>
23*90c8c64dSAndroid Build Coastguard Worker
24*90c8c64dSAndroid Build Coastguard Worker namespace {
25*90c8c64dSAndroid Build Coastguard Worker
26*90c8c64dSAndroid Build Coastguard Worker constexpr int32_t GOOGLE_VENDOR_ID = 0x18d1;
27*90c8c64dSAndroid Build Coastguard Worker constexpr int32_t PRODUCT_ID = 0x0001;
28*90c8c64dSAndroid Build Coastguard Worker
openUinputTouchscreen(int width,int height)29*90c8c64dSAndroid Build Coastguard Worker android::base::unique_fd openUinputTouchscreen(int width, int height) {
30*90c8c64dSAndroid Build Coastguard Worker return openUinput("Monkey touch", GOOGLE_VENDOR_ID, PRODUCT_ID,
31*90c8c64dSAndroid Build Coastguard Worker /*phys=*/"monkeydevice", android::DeviceType::TOUCHSCREEN,
32*90c8c64dSAndroid Build Coastguard Worker height, width);
33*90c8c64dSAndroid Build Coastguard Worker }
34*90c8c64dSAndroid Build Coastguard Worker } // namespace
35*90c8c64dSAndroid Build Coastguard Worker
36*90c8c64dSAndroid Build Coastguard Worker class MonkeyService : public aidl::com::android::commands::monkey::BnMonkey {
37*90c8c64dSAndroid Build Coastguard Worker public:
MonkeyService(int width,int height)38*90c8c64dSAndroid Build Coastguard Worker MonkeyService(int width, int height)
39*90c8c64dSAndroid Build Coastguard Worker : mTouchScreen(openUinputTouchscreen(width, height)) {}
40*90c8c64dSAndroid Build Coastguard Worker
41*90c8c64dSAndroid Build Coastguard Worker private:
writeTouchEvent(int32_t pointerId,int32_t toolType,int32_t action,float x,float y,float pressure,float majorAxisSize,int64_t eventTime,bool * _aidl_return)42*90c8c64dSAndroid Build Coastguard Worker ::ndk::ScopedAStatus writeTouchEvent(int32_t pointerId, int32_t toolType,
43*90c8c64dSAndroid Build Coastguard Worker int32_t action, float x, float y,
44*90c8c64dSAndroid Build Coastguard Worker float pressure, float majorAxisSize,
45*90c8c64dSAndroid Build Coastguard Worker int64_t eventTime,
46*90c8c64dSAndroid Build Coastguard Worker bool *_aidl_return) override {
47*90c8c64dSAndroid Build Coastguard Worker *_aidl_return = mTouchScreen.writeTouchEvent(
48*90c8c64dSAndroid Build Coastguard Worker pointerId, toolType, action, x, y, pressure, majorAxisSize,
49*90c8c64dSAndroid Build Coastguard Worker std::chrono::nanoseconds(eventTime));
50*90c8c64dSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
51*90c8c64dSAndroid Build Coastguard Worker }
52*90c8c64dSAndroid Build Coastguard Worker
53*90c8c64dSAndroid Build Coastguard Worker android::VirtualTouchscreen mTouchScreen;
54*90c8c64dSAndroid Build Coastguard Worker };
55*90c8c64dSAndroid Build Coastguard Worker
createNativeService(JNIEnv * env,jclass,jint width,jint height)56*90c8c64dSAndroid Build Coastguard Worker static jobject createNativeService(JNIEnv *env, jclass, jint width,
57*90c8c64dSAndroid Build Coastguard Worker jint height) {
58*90c8c64dSAndroid Build Coastguard Worker std::shared_ptr<MonkeyService> service =
59*90c8c64dSAndroid Build Coastguard Worker ndk::SharedRefBase::make<MonkeyService>(width, height);
60*90c8c64dSAndroid Build Coastguard Worker // The call `AIBinder_toJavaBinder` increments the refcount, so this will
61*90c8c64dSAndroid Build Coastguard Worker // prevent "service" from getting destructed. The ownership will now be
62*90c8c64dSAndroid Build Coastguard Worker // transferred to Java.
63*90c8c64dSAndroid Build Coastguard Worker return AIBinder_toJavaBinder(env, service->asBinder().get());
64*90c8c64dSAndroid Build Coastguard Worker }
65*90c8c64dSAndroid Build Coastguard Worker
66*90c8c64dSAndroid Build Coastguard Worker extern "C" JNIEXPORT jobject JNICALL
Java_com_android_commands_monkey_Monkey_createNativeService(JNIEnv * env,jclass clazz,jint width,jint height)67*90c8c64dSAndroid Build Coastguard Worker Java_com_android_commands_monkey_Monkey_createNativeService(JNIEnv *env,
68*90c8c64dSAndroid Build Coastguard Worker jclass clazz,
69*90c8c64dSAndroid Build Coastguard Worker jint width,
70*90c8c64dSAndroid Build Coastguard Worker jint height) {
71*90c8c64dSAndroid Build Coastguard Worker return createNativeService(env, clazz, width, height);
72*90c8c64dSAndroid Build Coastguard Worker }
73