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
17 def add_service(args
, userUnlocked
, packageStateChanged
):
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_userUnlocked
:
30 status
, arg1
= reader
.read_int32()
32 local_response
.append_int32(0)
33 elif code
== TRANSACTION_packageStateChanged
:
34 status
, arg1
= reader
.read_int32()
35 arg2
= reader
.read_string16()
36 status
, arg3
= reader
.read_int32()
37 packageStateChanged(arg1
, arg2
, arg3
)
38 local_response
.append_int32(0)
40 return local_response
, -99999 # Some error unknown to binder to force a RemoteException
42 return local_response
, 0
44 def binder_presence():
45 if serviceManager
.is_present():
46 status
= serviceManager
.add_service_sync(SERVICE_NAME
, response
)
49 logging
.error("Failed to add service {}: {}".format(
50 SERVICE_NAME
, status
))
51 args
.userMonitorLoop
.quit()
53 response
= serviceManager
.new_local_object(INTERFACE
, response_handler
)
54 args
.userMonitorLoop
= GLib
.MainLoop()
56 status
= serviceManager
.add_presence_handler(binder_presence
)
58 args
.userMonitorLoop
.run()
59 serviceManager
.remove_handler(status
)
62 logging
.error("Failed to add presence handler: {}".format(status
))