]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/services/user_manager.py
.desktop files should not be executable (#815)
[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, session, 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("Categories=X-WayDroid-App;")
31 lines.append("X-Purism-FormFactor=Workstation;Mobile;")
32 lines.append("Actions=app_settings;")
33 lines.append("[Desktop Action app_settings]")
34 lines.append("Name=App Settings")
35 lines.append("Exec=waydroid app intent android.settings.APPLICATION_DETAILS_SETTINGS package:" + packageName)
36 desktop_file = open(desktop_file_path, "w")
37 for line in lines:
38 desktop_file.write(line + "\n")
39 desktop_file.close()
40 os.chmod(desktop_file_path, 0o644)
41 return 0
42
43 def makeWaydroidDesktopFile(hide):
44 desktop_file_path = args.apps_dir + "/Waydroid.desktop"
45 if os.path.isfile(desktop_file_path):
46 os.remove(desktop_file_path)
47 lines = ["[Desktop Entry]", "Type=Application"]
48 lines.append("Name=Waydroid")
49 lines.append("Exec=waydroid show-full-ui")
50 lines.append("Categories=X-WayDroid-App;")
51 lines.append("X-Purism-FormFactor=Workstation;Mobile;")
52 if hide:
53 lines.append("NoDisplay=true")
54 lines.append("Icon=waydroid")
55 desktop_file = open(desktop_file_path, "w")
56 for line in lines:
57 desktop_file.write(line + "\n")
58 desktop_file.close()
59 os.chmod(desktop_file_path, 0o644)
60
61 def userUnlocked(uid):
62 logging.info("Android with user {} is ready".format(uid))
63 args.waydroid_data = session["waydroid_data"]
64 args.apps_dir = session["xdg_data_home"] + \
65 "/applications/"
66
67 platformService = IPlatform.get_service(args)
68 if platformService:
69 if not os.path.exists(args.apps_dir):
70 os.mkdir(args.apps_dir)
71 os.chmod(args.apps_dir, 0o700)
72 appsList = platformService.getAppsInfo()
73 for app in appsList:
74 makeDesktopFile(app)
75 multiwin = platformService.getprop("persist.waydroid.multi_windows", "false")
76 if multiwin == "false":
77 makeWaydroidDesktopFile(False)
78 else:
79 makeWaydroidDesktopFile(True)
80 if unlocked_cb:
81 unlocked_cb()
82
83 def packageStateChanged(mode, packageName, uid):
84 platformService = IPlatform.get_service(args)
85 if platformService:
86 appInfo = platformService.getAppInfo(packageName)
87 desktop_file_path = args.apps_dir + "/waydroid." + packageName + ".desktop"
88 if mode == 0:
89 # Package added
90 makeDesktopFile(appInfo)
91 elif mode == 1:
92 if os.path.isfile(desktop_file_path):
93 os.remove(desktop_file_path)
94 else:
95 if os.path.isfile(desktop_file_path):
96 if makeDesktopFile(appInfo) == -1:
97 os.remove(desktop_file_path)
98
99 def service_thread():
100 while not stopping:
101 IUserMonitor.add_service(args, userUnlocked, packageStateChanged)
102
103 global stopping
104 stopping = False
105 args.user_manager = threading.Thread(target=service_thread)
106 args.user_manager.start()
107
108 def stop(args):
109 global stopping
110 stopping = True
111 try:
112 if args.userMonitorLoop:
113 args.userMonitorLoop.quit()
114 except AttributeError:
115 logging.debug("UserMonitor service is not even started")