3 from tools
import helpers
4 from gi
.repository
import GLib
7 INTERFACE
= "lineageos.waydroid.IUserMonitor"
8 SERVICE_NAME
= "waydroidusermonitor"
10 TRANSACTION_userUnlocked
= 1
11 TRANSACTION_packageStateChanged
= 2
13 def add_service(args
, userUnlocked
, packageStateChanged
):
14 helpers
.drivers
.loadBinderNodes(args
)
15 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
)
17 def response_handler(req
, code
, flags
):
19 "{}: Received transaction: {}".format(SERVICE_NAME
, code
))
20 reader
= req
.init_reader()
21 local_response
= response
.new_reply()
22 if code
== TRANSACTION_userUnlocked
:
23 status
, arg1
= reader
.read_int32()
25 local_response
.append_int32(0)
26 if code
== TRANSACTION_packageStateChanged
:
27 status
, arg1
= reader
.read_int32()
28 arg2
= reader
.read_string16()
29 status
, arg3
= reader
.read_int32()
30 packageStateChanged(arg1
, arg2
, arg3
)
31 local_response
.append_int32(0)
33 return local_response
, 0
35 def binder_presence():
36 if serviceManager
.is_present():
37 status
= serviceManager
.add_service_sync(SERVICE_NAME
, response
)
40 logging
.error("Failed to add service {}: {}".format(
41 SERVICE_NAME
, status
))
42 args
.userMonitorLoop
.quit()
44 response
= serviceManager
.new_local_object(INTERFACE
, response_handler
)
45 args
.userMonitorLoop
= GLib
.MainLoop()
47 status
= serviceManager
.add_presence_handler(binder_presence
)
49 args
.userMonitorLoop
.run()
50 serviceManager
.remove_handler(status
)
53 logging
.error("Failed to add presence handler: {}".format(status
))