xref: /aosp_15_r20/development/cmds/monkey/libmonkey_jni/libmonkey_jni.cpp (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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