]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/interfaces/IUserMonitor.py
tools: Fully restart services
[waydroid.git] / tools / interfaces / IUserMonitor.py
1 import gbinder
2 import logging
3 from tools import helpers
4 from gi.repository import GLib
5
6
7 INTERFACE = "lineageos.waydroid.IUserMonitor"
8 SERVICE_NAME = "waydroidusermonitor"
9
10 TRANSACTION_userUnlocked = 1
11 TRANSACTION_packageStateChanged = 2
12
13 def add_service(args, userUnlocked, packageStateChanged):
14 helpers.drivers.loadBinderNodes(args)
15 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER)
16
17 def response_handler(req, code, flags):
18 logging.debug(
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()
24 userUnlocked(arg1)
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)
32
33 return local_response, 0
34
35 def binder_presence():
36 if serviceManager.is_present():
37 status = serviceManager.add_service_sync(SERVICE_NAME, response)
38
39 if status:
40 logging.error("Failed to add service {}: {}".format(
41 SERVICE_NAME, status))
42 args.userMonitorLoop.quit()
43
44 response = serviceManager.new_local_object(INTERFACE, response_handler)
45 args.userMonitorLoop = GLib.MainLoop()
46 binder_presence()
47 status = serviceManager.add_presence_handler(binder_presence)
48 if status:
49 args.userMonitorLoop.run()
50 serviceManager.remove_handler(status)
51 del serviceManager
52 else:
53 logging.error("Failed to add presence handler: {}".format(status))
54