3 from tools
import helpers
4 from gi
.repository
import GLib
7 INTERFACE
= "lineageos.waydroid.IHardware"
8 SERVICE_NAME
= "waydroidhardware"
10 TRANSACTION_enableNFC
= 1
11 TRANSACTION_enableBluetooth
= 2
12 TRANSACTION_suspend
= 3
13 TRANSACTION_reboot
= 4
14 TRANSACTION_upgrade
= 5
15 TRANSACTION_upgrade2
= 6
17 def add_service(args
, enableNFC
, enableBluetooth
, suspend
, reboot
, upgrade
):
18 helpers
.drivers
.loadBinderNodes(args
)
20 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
, args
.SERVICE_MANAGER_PROTOCOL
, args
.BINDER_PROTOCOL
)
22 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
)
24 def response_handler(req
, code
, flags
):
26 "{}: Received transaction: {}".format(SERVICE_NAME
, code
))
27 reader
= req
.init_reader()
28 local_response
= response
.new_reply()
29 if code
== TRANSACTION_enableNFC
:
30 status
, arg1
= reader
.read_int32()
31 ret
= enableNFC(arg1
!= 0)
32 local_response
.append_int32(0)
33 local_response
.append_int32(ret
)
34 if code
== TRANSACTION_enableBluetooth
:
35 status
, arg1
= reader
.read_int32()
36 ret
= enableBluetooth(arg1
!= 0)
37 local_response
.append_int32(0)
38 local_response
.append_int32(ret
)
39 if code
== TRANSACTION_suspend
:
41 local_response
.append_int32(0)
42 if code
== TRANSACTION_reboot
:
44 local_response
.append_int32(0)
45 if code
== TRANSACTION_upgrade
:
46 arg1
= reader
.read_string16()
47 status
, arg2
= reader
.read_int32()
48 arg3
= reader
.read_string16()
49 status
, arg4
= reader
.read_int32()
50 upgrade(arg1
, arg2
, arg3
, arg4
)
51 local_response
.append_int32(0)
52 if code
== TRANSACTION_upgrade2
:
53 arg1
= reader
.read_string16()
54 status
, arg2
= reader
.read_int64()
55 arg3
= reader
.read_string16()
56 status
, arg4
= reader
.read_int64()
57 upgrade(arg1
, arg2
, arg3
, arg4
)
58 local_response
.append_int32(0)
60 return local_response
, 0
62 def binder_presence():
63 if serviceManager
.is_present():
64 status
= serviceManager
.add_service_sync(SERVICE_NAME
, response
)
67 logging
.error("Failed to add service {}: {}".format(
68 SERVICE_NAME
, status
))
69 args
.hardwareLoop
.quit()
71 response
= serviceManager
.new_local_object(INTERFACE
, response_handler
)
72 args
.hardwareLoop
= GLib
.MainLoop()
74 status
= serviceManager
.add_presence_handler(binder_presence
)
76 args
.hardwareLoop
.run()
77 serviceManager
.remove_handler(status
)
80 logging
.error("Failed to add presence handler: {}".format(status
))