]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/services/user_manager.py
container: Don’t burn XDG permissions
[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
11 def start(args):
12 def makeDesktopFile(appInfo):
13 showApp = False
14 for cat in appInfo["categories"]:
15 if cat.strip() == "android.intent.category.LAUNCHER":
16 showApp = True
17 if not showApp:
18 return -1
19
20 packageName = appInfo["packageName"]
21
22 desktop_file_path = args.host_user + \
23 "/.local/share/applications/" + packageName + ".desktop"
24 if not os.path.exists(desktop_file_path):
25 lines = ["[Desktop Entry]", "Type=Application"]
26 lines.append("Name=" + appInfo["name"])
27 lines.append("Exec=waydroid app launch " + packageName)
28 lines.append("Icon=" + args.waydroid_data + "/icons/" + packageName + ".png")
29 desktop_file = open(desktop_file_path, "w")
30 for line in lines:
31 desktop_file.write(line + "\n")
32 desktop_file.close()
33 os.chmod(desktop_file_path, 0o755)
34 return 0
35
36 def makeWaydroidDesktopFile():
37 desktop_file_path = args.host_user + \
38 "/.local/share/applications/Waydroid.desktop"
39 if not os.path.exists(desktop_file_path):
40 lines = ["[Desktop Entry]", "Type=Application"]
41 lines.append("Name=Waydroid")
42 lines.append("Exec=waydroid show-full-ui")
43 lines.append("Icon=" + tools.config.tools_src + "/data/AppIcon.png")
44 desktop_file = open(desktop_file_path, "w")
45 for line in lines:
46 desktop_file.write(line + "\n")
47 desktop_file.close()
48 os.chmod(desktop_file_path, 0o755)
49
50 def userUnlocked(uid):
51 logging.info("Android with user {} is ready".format(uid))
52 session_cfg = tools.config.load_session()
53 args.waydroid_data = session_cfg["session"]["waydroid_data"]
54 args.host_user = session_cfg["session"]["host_user"]
55
56 platformService = IPlatform.get_service(args)
57 if platformService:
58 appsList = platformService.getAppsInfo()
59 for app in appsList:
60 makeDesktopFile(app)
61 multiwin = platformService.getprop("persist.waydroid.multi_windows", "false")
62 if multiwin == "false":
63 makeWaydroidDesktopFile()
64 else:
65 desktop_file_path = args.host_user + \
66 "/.local/share/applications/Waydroid.desktop"
67 if os.path.isfile(desktop_file_path):
68 os.remove(desktop_file_path)
69
70 def packageStateChanged(mode, packageName, uid):
71 platformService = IPlatform.get_service(args)
72 if platformService:
73 appInfo = platformService.getAppInfo(packageName)
74 desktop_file_path = args.host_user + \
75 "/.local/share/applications/" + packageName + ".desktop"
76 if mode == 0:
77 # Package added
78 makeDesktopFile(appInfo)
79 elif mode == 1:
80 if os.path.isfile(desktop_file_path):
81 os.remove(desktop_file_path)
82 else:
83 if os.path.isfile(desktop_file_path):
84 if makeDesktopFile(appInfo) == -1:
85 os.remove(desktop_file_path)
86
87 def service_thread():
88 IUserMonitor.add_service(args, userUnlocked, packageStateChanged)
89
90 args.user_manager = threading.Thread(target=service_thread)
91 args.user_manager.start()
92
93 def stop(args):
94 try:
95 if args.userMonitorLoop:
96 args.userMonitorLoop.quit()
97 except AttributeError:
98 logging.debug("UserMonitor service is not even started")