]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/actions/session_manager.py
app_manager: Allow install/remove/list while frozen
[waydroid.git] / tools / actions / session_manager.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import time
6 import signal
7 import sys
8 import shutil
9 import tools.config
10 import tools.helpers.ipc
11 from tools import services
12 import dbus
13 import dbus.service
14 import dbus.exceptions
15 from gi.repository import GLib
16 import copy
17
18 class DbusSessionManager(dbus.service.Object):
19 def __init__(self, looper, bus, object_path, args):
20 self.args = args
21 self.looper = looper
22 dbus.service.Object.__init__(self, bus, object_path)
23
24 @dbus.service.method("id.waydro.SessionManager", in_signature='', out_signature='')
25 def Stop(self):
26 do_stop(self.args, self.looper)
27 stop_container()
28
29 def service(args, looper):
30 dbus_obj = DbusSessionManager(looper, dbus.SessionBus(), '/SessionManager', args)
31 looper.run()
32
33 def start(args, unlocked_cb=None):
34 try:
35 name = dbus.service.BusName("id.waydro.Session", dbus.SessionBus(), do_not_queue=True)
36 except dbus.exceptions.NameExistsException:
37 logging.error("Session is already running")
38 if unlocked_cb:
39 unlocked_cb()
40 return
41
42 session = copy.copy(tools.config.session_defaults);
43 wayland_display = session["wayland_display"]
44 if wayland_display == "None" or not wayland_display:
45 logging.warning('WAYLAND_DISPLAY is not set, defaulting to "wayland-0"')
46 waydroid_data = session["waydroid_data"]
47 if not os.path.isdir(waydroid_data):
48 os.makedirs(waydroid_data)
49 dpi = tools.helpers.props.host_get(args, "ro.sf.lcd_density")
50 if dpi == "":
51 dpi = os.getenv("GRID_UNIT_PX")
52 if dpi is not None:
53 dpi = str(int(dpi) * 20)
54 else:
55 dpi = "0"
56 session["lcd_density"] = dpi
57
58 mainloop = GLib.MainLoop()
59
60 def sigint_handler(data):
61 do_stop(args, mainloop)
62 stop_container()
63
64 def sigusr_handler(data):
65 do_stop(args, mainloop)
66
67 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGINT, sigint_handler, None)
68 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, sigint_handler, None)
69 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGUSR1, sigusr_handler, None)
70 try:
71 tools.helpers.ipc.DBusContainerService().Start(session)
72 except dbus.DBusException:
73 logging.error("WayDroid container is not listening")
74 sys.exit(0)
75
76
77 services.user_manager.start(args, session, unlocked_cb)
78 services.clipboard_manager.start(args)
79 service(args, mainloop)
80
81 def do_stop(args, looper):
82 services.user_manager.stop(args)
83 services.clipboard_manager.stop(args)
84 looper.quit()
85
86 def stop(args):
87 try:
88 tools.helpers.ipc.DBusSessionService().Stop()
89 except dbus.DBusException:
90 stop_container()
91
92 def stop_container():
93 try:
94 tools.helpers.ipc.DBusContainerService().Stop()
95 except dbus.DBusException:
96 pass