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