]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/interfaces/IUserMonitor.py
tools/helpers/http.py: also handle urllib.error.URLError exceptions instead of showin...
[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 PACKAGE_ADDED = 0;
14 PACKAGE_REMOVED = 1;
15 PACKAGE_UPDATED = 2;
16
17 def add_service(args, userUnlocked, packageStateChanged):
18 helpers.drivers.loadBinderNodes(args)
19 try:
20 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER, args.SERVICE_MANAGER_PROTOCOL, args.BINDER_PROTOCOL)
21 except TypeError:
22 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER)
23
24 def response_handler(req, code, flags):
25 logging.debug(
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()
31 userUnlocked(arg1)
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)
39 else:
40 return local_response, -99999 # Some error unknown to binder to force a RemoteException
41
42 return local_response, 0
43
44 def binder_presence():
45 if serviceManager.is_present():
46 status = serviceManager.add_service_sync(SERVICE_NAME, response)
47
48 if status:
49 logging.error("Failed to add service {}: {}".format(
50 SERVICE_NAME, status))
51 args.userMonitorLoop.quit()
52
53 response = serviceManager.new_local_object(INTERFACE, response_handler)
54 args.userMonitorLoop = GLib.MainLoop()
55 binder_presence()
56 status = serviceManager.add_presence_handler(binder_presence)
57 if status:
58 args.userMonitorLoop.run()
59 serviceManager.remove_handler(status)
60 del serviceManager
61 else:
62 logging.error("Failed to add presence handler: {}".format(status))
63