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