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