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