]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/services/user_manager.py
lxc: Allow shell and logcat from frozen
[waydroid.git] / tools / services / user_manager.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import threading
6 import tools.config
7 from tools.interfaces import IUserMonitor
8 from tools.interfaces import IPlatform
9
10 stopping = False
11
12 def start(args, unlocked_cb=None):
13
14 def makeDesktopFile(appInfo):
15 showApp = False
16 for cat in appInfo["categories"]:
17 if cat.strip() == "android.intent.category.LAUNCHER":
18 showApp = True
19 if not showApp:
20 return -1
21
22 packageName = appInfo["packageName"]
23
24 desktop_file_path = args.apps_dir + "/waydroid." + packageName + ".desktop"
25 if not os.path.exists(desktop_file_path):
26 lines = ["[Desktop Entry]", "Type=Application"]
27 lines.append("Name=" + appInfo["name"])
28 lines.append("Exec=waydroid app launch " + packageName)
29 lines.append("Icon=" + args.waydroid_data + "/icons/" + packageName + ".png")
30 lines.append("X-Purism-FormFactor=Workstation;Mobile;")
31 desktop_file = open(desktop_file_path, "w")
32 for line in lines:
33 desktop_file.write(line + "\n")
34 desktop_file.close()
35 os.chmod(desktop_file_path, 0o755)
36 return 0
37
38 def makeWaydroidDesktopFile(hide):
39 desktop_file_path = args.apps_dir + "/Waydroid.desktop"
40 if os.path.isfile(desktop_file_path):
41 os.remove(desktop_file_path)
42 lines = ["[Desktop Entry]", "Type=Application"]
43 lines.append("Name=Waydroid")
44 lines.append("Exec=waydroid show-full-ui")
45 lines.append("X-Purism-FormFactor=Workstation;Mobile;")
46 if hide:
47 lines.append("NoDisplay=true")
48 lines.append("Icon=" + tools.config.tools_src + "/data/AppIcon.png")
49 desktop_file = open(desktop_file_path, "w")
50 for line in lines:
51 desktop_file.write(line + "\n")
52 desktop_file.close()
53 os.chmod(desktop_file_path, 0o755)
54
55 def userUnlocked(uid):
56 logging.info("Android with user {} is ready".format(uid))
57 session_cfg = tools.config.load_session()
58 args.waydroid_data = session_cfg["session"]["waydroid_data"]
59 args.apps_dir = session_cfg["session"]["xdg_data_home"] + \
60 "/applications/"
61
62 platformService = IPlatform.get_service(args)
63 if platformService:
64 if not os.path.exists(args.apps_dir):
65 os.mkdir(args.apps_dir)
66 os.chmod(args.apps_dir, 0o700)
67 appsList = platformService.getAppsInfo()
68 for app in appsList:
69 makeDesktopFile(app)
70 multiwin = platformService.getprop("persist.waydroid.multi_windows", "false")
71 if multiwin == "false":
72 makeWaydroidDesktopFile(False)
73 else:
74 makeWaydroidDesktopFile(True)
75 if unlocked_cb:
76 unlocked_cb(args)
77
78 def packageStateChanged(mode, packageName, uid):
79 platformService = IPlatform.get_service(args)
80 if platformService:
81 appInfo = platformService.getAppInfo(packageName)
82 desktop_file_path = args.apps_dir + "/" + packageName + ".desktop"
83 if mode == 0:
84 # Package added
85 makeDesktopFile(appInfo)
86 elif mode == 1:
87 if os.path.isfile(desktop_file_path):
88 os.remove(desktop_file_path)
89 else:
90 if os.path.isfile(desktop_file_path):
91 if makeDesktopFile(appInfo) == -1:
92 os.remove(desktop_file_path)
93
94 def service_thread():
95 while not stopping:
96 IUserMonitor.add_service(args, userUnlocked, packageStateChanged)
97
98 global stopping
99 stopping = False
100 args.user_manager = threading.Thread(target=service_thread)
101 args.user_manager.start()
102
103 def stop(args):
104 global stopping
105 stopping = True
106 try:
107 if args.userMonitorLoop:
108 args.userMonitorLoop.quit()
109 except AttributeError:
110 logging.debug("UserMonitor service is not even started")