]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/interfaces/IHardware.py
hardware-manager: Optionally stop the session on suspend
[waydroid.git] / tools / interfaces / IHardware.py
1 import gbinder
2 import logging
3 from tools import helpers
4 from gi.repository import GLib
5
6
7 INTERFACE = "lineageos.waydroid.IHardware"
8 SERVICE_NAME = "waydroidhardware"
9
10 TRANSACTION_enableNFC = 1
11 TRANSACTION_enableBluetooth = 2
12 TRANSACTION_suspend = 3
13 TRANSACTION_reboot = 4
14 TRANSACTION_upgrade = 5
15
16 def add_service(args, enableNFC, enableBluetooth, suspend, reboot, upgrade):
17 helpers.drivers.loadBinderNodes(args)
18 try:
19 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER, args.SERVICE_MANAGER_PROTOCOL, args.BINDER_PROTOCOL)
20 except TypeError:
21 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER)
22
23 def response_handler(req, code, flags):
24 logging.debug(
25 "{}: Received transaction: {}".format(SERVICE_NAME, code))
26 reader = req.init_reader()
27 local_response = response.new_reply()
28 if code == TRANSACTION_enableNFC:
29 status, arg1 = reader.read_int32()
30 ret = enableNFC(arg1 != 0)
31 local_response.append_int32(0)
32 local_response.append_int32(ret)
33 if code == TRANSACTION_enableBluetooth:
34 status, arg1 = reader.read_int32()
35 ret = enableBluetooth(arg1 != 0)
36 local_response.append_int32(0)
37 local_response.append_int32(ret)
38 if code == TRANSACTION_suspend:
39 suspend()
40 local_response.append_int32(0)
41 if code == TRANSACTION_reboot:
42 reboot()
43 local_response.append_int32(0)
44 if code == TRANSACTION_upgrade:
45 arg1 = reader.read_string16()
46 status, arg2 = reader.read_int32()
47 arg3 = reader.read_string16()
48 status, arg4 = reader.read_int32()
49 upgrade(arg1, arg2, arg3, arg4)
50 local_response.append_int32(0)
51
52 return local_response, 0
53
54 def binder_presence():
55 if serviceManager.is_present():
56 status = serviceManager.add_service_sync(SERVICE_NAME, response)
57
58 if status:
59 logging.error("Failed to add service {}: {}".format(
60 SERVICE_NAME, status))
61 args.hardwareLoop.quit()
62
63 response = serviceManager.new_local_object(INTERFACE, response_handler)
64 args.hardwareLoop = GLib.MainLoop()
65 binder_presence()
66 status = serviceManager.add_presence_handler(binder_presence)
67 if status:
68 args.hardwareLoop.run()
69 serviceManager.remove_handler(status)
70 del serviceManager
71 else:
72 logging.error("Failed to add presence handler: {}".format(status))