]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/actions/app_manager.py
container: Only umount /sys/fs/cgroup/schedtune if needed
[waydroid.git] / tools / actions / app_manager.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import shutil
6 import time
7 import tools.config
8 import tools.helpers.props
9 from tools.interfaces import IPlatform
10 from tools.interfaces import IStatusBarService
11
12 def install(args):
13 if os.path.exists(tools.config.session_defaults["config_path"]):
14 session_cfg = tools.config.load_session()
15 if session_cfg["session"]["state"] == "RUNNING":
16 tmp_dir = session_cfg["session"]["waydroid_data"] + "/waydroid_tmp"
17 if not os.path.exists(tmp_dir):
18 os.makedirs(tmp_dir)
19
20 shutil.copyfile(args.PACKAGE, tmp_dir + "/base.apk")
21 platformService = IPlatform.get_service(args)
22 if platformService:
23 platformService.installApp("/data/waydroid_tmp/base.apk")
24 shutil.rmtree(tmp_dir)
25 else:
26 logging.error("WayDroid container is {}".format(
27 session_cfg["session"]["state"]))
28 else:
29 logging.error("WayDroid session is stopped")
30
31 def remove(args):
32 if os.path.exists(tools.config.session_defaults["config_path"]):
33 session_cfg = tools.config.load_session()
34 if session_cfg["session"]["state"] == "RUNNING":
35 platformService = IPlatform.get_service(args)
36 if platformService:
37 ret = platformService.removeApp(args.PACKAGE)
38 if ret != 0:
39 logging.error("Failed to uninstall package: {}".format(args.PACKAGE))
40 else:
41 logging.error("Failed to access IPlatform service")
42 else:
43 logging.error("WayDroid container is {}".format(
44 session_cfg["session"]["state"]))
45 else:
46 logging.error("WayDroid session is stopped")
47
48 def maybeLaunchLater(args, retry, launchNow):
49 if os.path.exists(tools.config.session_defaults["config_path"]):
50 session_cfg = tools.config.load_session()
51
52 if session_cfg["session"]["state"] == "RUNNING":
53 launchNow()
54 elif session_cfg["session"]["state"] == "FROZEN" or session_cfg["session"]["state"] == "UNFREEZE":
55 session_cfg["session"]["state"] = "UNFREEZE"
56 tools.config.save_session(session_cfg)
57 while session_cfg["session"]["state"] != "RUNNING":
58 session_cfg = tools.config.load_session()
59 launchNow()
60 else:
61 logging.error("WayDroid container is {}".format(
62 session_cfg["session"]["state"]))
63 else:
64 logging.error("Starting waydroid session")
65 tools.actions.session_manager.start(args, retry)
66
67 def launch(args):
68 def justLaunch():
69 platformService = IPlatform.get_service(args)
70 if platformService:
71 platformService.setprop("waydroid.active_apps", args.PACKAGE)
72 ret = platformService.launchApp(args.PACKAGE)
73 multiwin = platformService.getprop(
74 "persist.waydroid.multi_windows", "false")
75 if multiwin == "false":
76 platformService.settingsPutString(
77 2, "policy_control", "immersive.status=*")
78 else:
79 platformService.settingsPutString(
80 2, "policy_control", "immersive.full=*")
81 else:
82 logging.error("Failed to access IPlatform service")
83 maybeLaunchLater(args, launch, justLaunch)
84
85 def list(args):
86 if os.path.exists(tools.config.session_defaults["config_path"]):
87 session_cfg = tools.config.load_session()
88 if session_cfg["session"]["state"] == "RUNNING":
89 platformService = IPlatform.get_service(args)
90 if platformService:
91 appsList = platformService.getAppsInfo()
92 for app in appsList:
93 print("Name: " + app["name"])
94 print("packageName: " + app["packageName"])
95 print("categories:")
96 for cat in app["categories"]:
97 print("\t" + cat)
98 else:
99 logging.error("Failed to access IPlatform service")
100 else:
101 logging.error("WayDroid container is {}".format(
102 session_cfg["session"]["state"]))
103 else:
104 logging.error("WayDroid session is stopped")
105
106 def showFullUI(args):
107 def justShow():
108 platformService = IPlatform.get_service(args)
109 if platformService:
110 platformService.setprop("waydroid.active_apps", "Waydroid")
111 platformService.settingsPutString(2, "policy_control", "null*")
112 # HACK: Refresh display contents
113 statusBarService = IStatusBarService.get_service(args)
114 if statusBarService:
115 statusBarService.expand()
116 time.sleep(0.5)
117 statusBarService.collapse()
118 maybeLaunchLater(args, showFullUI, justShow)
119
120 def intent(args):
121 def justLaunch():
122 platformService = IPlatform.get_service(args)
123 if platformService:
124 ret = platformService.launchIntent(args.ACTION, args.URI)
125 if ret == "":
126 return
127 pkg = ret if ret != "android" else "Waydroid"
128 platformService.setprop("waydroid.active_apps", pkg)
129 multiwin = platformService.getprop(
130 "persist.waydroid.multi_windows", "false")
131 if multiwin == "false":
132 platformService.settingsPutString(
133 2, "policy_control", "immersive.status=*")
134 else:
135 platformService.settingsPutString(
136 2, "policy_control", "immersive.full=*")
137 else:
138 logging.error("Failed to access IPlatform service")
139 maybeLaunchLater(args, intent, justLaunch)