• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/android/android_input_receiver_compat.h"
6 
7 #include <dlfcn.h>
8 
9 #include "base/android/build_info.h"
10 #include "base/check.h"
11 #include "base/logging.h"
12 
13 namespace base {
14 
AndroidInputReceiverCompat()15 AndroidInputReceiverCompat::AndroidInputReceiverCompat() {
16   DCHECK(IsSupportAvailable());
17 
18   void* main_dl_handle = dlopen("libandroid.so", RTLD_NOW);
19   if (!main_dl_handle) {
20     LOG(ERROR) << "Couldnt load android so";
21     return;
22   }
23 
24   *reinterpret_cast<void**>(&AInputTransferToken_fromJavaFn) =
25       dlsym(main_dl_handle, "AInputTransferToken_fromJava");
26   DCHECK(AInputTransferToken_fromJavaFn);
27 
28   *reinterpret_cast<void**>(&AInputTransferToken_toJavaFn) =
29       dlsym(main_dl_handle, "AInputTransferToken_toJava");
30   DCHECK(AInputTransferToken_toJavaFn);
31 
32   *reinterpret_cast<void**>(&AInputTransferToken_releaseFn) =
33       dlsym(main_dl_handle, "AInputTransferToken_release");
34   DCHECK(AInputTransferToken_releaseFn);
35 
36   *reinterpret_cast<void**>(&AInputEvent_toJavaFn) =
37       dlsym(main_dl_handle, "AInputEvent_toJava");
38   DCHECK(AInputEvent_toJavaFn);
39 
40   *reinterpret_cast<void**>(&AInputReceiverCallbacks_createFn) =
41       dlsym(main_dl_handle, "AInputReceiverCallbacks_create");
42   DCHECK(AInputReceiverCallbacks_createFn);
43 
44   *reinterpret_cast<void**>(&AInputReceiverCallbacks_releaseFn) =
45       dlsym(main_dl_handle, "AInputReceiverCallbacks_release");
46   DCHECK(AInputReceiverCallbacks_releaseFn);
47 
48   *reinterpret_cast<void**>(&AInputReceiverCallbacks_setMotionEventCallbackFn) =
49       dlsym(main_dl_handle, "AInputReceiverCallbacks_setMotionEventCallback");
50   DCHECK(AInputReceiverCallbacks_setMotionEventCallbackFn);
51 
52   *reinterpret_cast<void**>(&AInputReceiver_createUnbatchedInputReceiverFn) =
53       dlsym(main_dl_handle, "AInputReceiver_createUnbatchedInputReceiver");
54   DCHECK(AInputReceiver_createUnbatchedInputReceiverFn);
55 
56   *reinterpret_cast<void**>(&AInputReceiver_getInputTransferTokenFn) =
57       dlsym(main_dl_handle, "AInputReceiver_getInputTransferToken");
58   DCHECK(AInputReceiver_getInputTransferTokenFn);
59 
60   *reinterpret_cast<void**>(&AInputReceiver_releaseFn) =
61       dlsym(main_dl_handle, "AInputReceiver_release");
62   DCHECK(AInputReceiver_releaseFn);
63 }
64 
65 // static
IsSupportAvailable()66 bool AndroidInputReceiverCompat::IsSupportAvailable() {
67   return base::android::BuildInfo::GetInstance()->sdk_int() >=
68          base::android::SDK_VERSION_V;
69 }
70 
71 // static
GetInstance()72 const AndroidInputReceiverCompat& AndroidInputReceiverCompat::GetInstance() {
73   static AndroidInputReceiverCompat compat;
74   return compat;
75 }
76 
77 }  // namespace base
78