]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/services/user_manager.py
net: Add "waydroid adb connect" action
[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 import tools.helpers.net
8 from tools.interfaces import IUserMonitor
9 from tools.interfaces import IPlatform
10
11 stopping = False
12
13 def start(args, session, unlocked_cb=None):
14 waydroid_data = session["waydroid_data"]
15 apps_dir = session["xdg_data_home"] + "/applications/"
16
17 def makeDesktopFile(appInfo):
18 if appInfo is None:
19 return -1
20
21 showApp = False
22 for cat in appInfo["categories"]:
23 if cat.strip() == "android.intent.category.LAUNCHER":
24 showApp = True
25 if not showApp:
26 return -1
27
28 packageName = appInfo["packageName"]
29
30 desktop_file_path = apps_dir + "/waydroid." + packageName + ".desktop"
31 if not os.path.exists(desktop_file_path):
32 with open(desktop_file_path, "w") as desktop_file:
33 desktop_file.write(f"""\
34 [Desktop Entry]
35 Type=Application
36 Name={appInfo["name"]}
37 Exec=waydroid app launch {packageName}
38 Icon={waydroid_data}/icons/{packageName}.png
39 Categories=X-WayDroid-App;
40 X-Purism-FormFactor=Workstation;Mobile;
41 Actions=app_settings;
42
43 [Desktop Action app_settings]
44 Name=App Settings
45 Exec=waydroid app intent android.settings.APPLICATION_DETAILS_SETTINGS package:{packageName}
46 Icon={waydroid_data}/icons/com.android.settings.png
47 """)
48 return 0
49
50 def makeWaydroidDesktopFile(hide):
51 desktop_file_path = apps_dir + "/Waydroid.desktop"
52 # If the user has set the desktop file as read-only, we won't replace it
53 if os.path.isfile(desktop_file_path) and not os.access(desktop_file_path, os.W_OK):
54 logging.info(f"Desktop file '{desktop_file_path}' is not writeable, not updating it")
55 else:
56 if os.path.isfile(desktop_file_path):
57 os.remove(desktop_file_path)
58 with open(desktop_file_path, "w") as desktop_file:
59 desktop_file.write(f"""\
60 [Desktop Entry]
61 Type=Application
62 Name=Waydroid
63 Exec=waydroid show-full-ui
64 Categories=X-WayDroid-App;Utility;
65 X-Purism-FormFactor=Workstation;Mobile;
66 Icon=waydroid
67 NoDisplay={str(hide).lower()}
68 """)
69
70 def userUnlocked(uid):
71 cfg = tools.config.load(args)
72 logging.info("Android with user {} is ready".format(uid))
73
74 if cfg["waydroid"]["auto_adb"] == "True":
75 try:
76 tools.helpers.net.adb_connect(args)
77 except:
78 pass
79
80 platformService = IPlatform.get_service(args)
81 if platformService:
82 if not os.path.exists(apps_dir):
83 os.mkdir(apps_dir, 0o700)
84 appsList = platformService.getAppsInfo()
85 for app in appsList:
86 makeDesktopFile(app)
87 multiwin = platformService.getprop("persist.waydroid.multi_windows", "false")
88 makeWaydroidDesktopFile(multiwin == "true")
89 if unlocked_cb:
90 unlocked_cb()
91
92 def packageStateChanged(mode, packageName, uid):
93 platformService = IPlatform.get_service(args)
94 if platformService:
95 appInfo = platformService.getAppInfo(packageName)
96 desktop_file_path = apps_dir + "/waydroid." + packageName + ".desktop"
97 if mode == 0:
98 # Package added
99 makeDesktopFile(appInfo)
100 elif mode == 1:
101 if os.path.isfile(desktop_file_path):
102 os.remove(desktop_file_path)
103 else:
104 if os.path.isfile(desktop_file_path):
105 if makeDesktopFile(appInfo) == -1:
106 os.remove(desktop_file_path)
107
108 def service_thread():
109 while not stopping:
110 IUserMonitor.add_service(args, userUnlocked, packageStateChanged)
111
112 global stopping
113 stopping = False
114 args.user_manager = threading.Thread(target=service_thread)
115 args.user_manager.start()
116
117 def stop(args):
118 global stopping
119 stopping = True
120 try:
121 if args.userMonitorLoop:
122 args.userMonitorLoop.quit()
123 except AttributeError:
124 logging.debug("UserMonitor service is not even started")