]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/actions/app_manager.py
debian: Upver to 1.5.4
[waydroid.git] / tools / actions / app_manager.py
index e0c3dda2223972dbd426dc59ea387f093bd5a701..ae9cb2550fe2a7cb0f9653b2d966c099954b8e5f 100644 (file)
@@ -6,63 +6,70 @@ import shutil
 import time
 import tools.config
 import tools.helpers.props
+import tools.helpers.ipc
 from tools.interfaces import IPlatform
 from tools.interfaces import IStatusBarService
+import dbus
 
 def install(args):
-    if os.path.exists(tools.config.session_defaults["config_path"]):
-        session_cfg = tools.config.load_session()
-        if session_cfg["session"]["state"] == "RUNNING":
-            tmp_dir = session_cfg["session"]["waydroid_data"] + "/waydroid_tmp"
-            if not os.path.exists(tmp_dir):
-                os.makedirs(tmp_dir)
-
-            shutil.copyfile(args.PACKAGE, tmp_dir + "/base.apk")
-            platformService = IPlatform.get_service(args)
-            if platformService:
-                platformService.installApp("/data/waydroid_tmp/base.apk")
-            shutil.rmtree(tmp_dir)
+    try:
+        tools.helpers.ipc.DBusSessionService()
+
+        cm = tools.helpers.ipc.DBusContainerService()
+        session = cm.GetSession()
+        if session["state"] == "FROZEN":
+            cm.Unfreeze()
+
+        tmp_dir = tools.config.session_defaults["waydroid_data"] + "/waydroid_tmp"
+        if not os.path.exists(tmp_dir):
+            os.makedirs(tmp_dir)
+
+        shutil.copyfile(args.PACKAGE, tmp_dir + "/base.apk")
+        platformService = IPlatform.get_service(args)
+        if platformService:
+            platformService.installApp("/data/waydroid_tmp/base.apk")
         else:
-            logging.error("WayDroid container is {}".format(
-                session_cfg["session"]["state"]))
-    else:
+            logging.error("Failed to access IPlatform service")
+        os.remove(tmp_dir + "/base.apk")
+
+        if session["state"] == "FROZEN":
+            cm.Freeze()
+    except (dbus.DBusException, KeyError):
         logging.error("WayDroid session is stopped")
 
 def remove(args):
-    if os.path.exists(tools.config.session_defaults["config_path"]):
-        session_cfg = tools.config.load_session()
-        if session_cfg["session"]["state"] == "RUNNING":
-            platformService = IPlatform.get_service(args)
-            if platformService:
-                ret = platformService.removeApp(args.PACKAGE)
-                if ret != 0:
-                    logging.error("Failed to uninstall package: {}".format(args.PACKAGE))
-            else:
-                logging.error("Failed to access IPlatform service")
+    try:
+        tools.helpers.ipc.DBusSessionService()
+
+        cm = tools.helpers.ipc.DBusContainerService()
+        session = cm.GetSession()
+        if session["state"] == "FROZEN":
+            cm.Unfreeze()
+
+        platformService = IPlatform.get_service(args)
+        if platformService:
+            ret = platformService.removeApp(args.PACKAGE)
+            if ret != 0:
+                logging.error("Failed to uninstall package: {}".format(args.PACKAGE))
         else:
-            logging.error("WayDroid container is {}".format(
-                session_cfg["session"]["state"]))
-    else:
+            logging.error("Failed to access IPlatform service")
+
+        if session["state"] == "FROZEN":
+            cm.Freeze()
+    except dbus.DBusException:
         logging.error("WayDroid session is stopped")
 
-def maybeLaunchLater(args, retry, launchNow):
-    if os.path.exists(tools.config.session_defaults["config_path"]):
-        session_cfg = tools.config.load_session()
-
-        if session_cfg["session"]["state"] == "RUNNING":
-            launchNow()
-        elif session_cfg["session"]["state"] == "FROZEN" or session_cfg["session"]["state"] == "UNFREEZE":
-            session_cfg["session"]["state"] = "UNFREEZE"
-            tools.config.save_session(session_cfg)
-            while session_cfg["session"]["state"] != "RUNNING":
-                session_cfg = tools.config.load_session()
-            launchNow()
-        else:
-            logging.error("WayDroid container is {}".format(
-                session_cfg["session"]["state"]))
-    else:
+def maybeLaunchLater(args, launchNow):
+    try:
+        tools.helpers.ipc.DBusSessionService()
+        try:
+            tools.helpers.ipc.DBusContainerService().Unfreeze()
+        except:
+            logging.error("Failed to unfreeze container. Trying to launch anyways...")
+        launchNow()
+    except dbus.DBusException:
         logging.error("Starting waydroid session")
-        tools.actions.session_manager.start(args, retry)
+        tools.actions.session_manager.start(args, launchNow, background=False)
 
 def launch(args):
     def justLaunch():
@@ -80,27 +87,32 @@ def launch(args):
                     2, "policy_control", "immersive.full=*")
         else:
             logging.error("Failed to access IPlatform service")
-    maybeLaunchLater(args, launch, justLaunch)
+    maybeLaunchLater(args, justLaunch)
 
 def list(args):
-    if os.path.exists(tools.config.session_defaults["config_path"]):
-        session_cfg = tools.config.load_session()
-        if session_cfg["session"]["state"] == "RUNNING":
-            platformService = IPlatform.get_service(args)
-            if platformService:
-                appsList = platformService.getAppsInfo()
-                for app in appsList:
-                    print("Name: " + app["name"])
-                    print("packageName: " + app["packageName"])
-                    print("categories:")
-                    for cat in app["categories"]:
-                        print("\t" + cat)
-            else:
-                logging.error("Failed to access IPlatform service")
+    try:
+        tools.helpers.ipc.DBusSessionService()
+
+        cm = tools.helpers.ipc.DBusContainerService()
+        session = cm.GetSession()
+        if session["state"] == "FROZEN":
+            cm.Unfreeze()
+
+        platformService = IPlatform.get_service(args)
+        if platformService:
+            appsList = platformService.getAppsInfo()
+            for app in appsList:
+                print("Name: " + app["name"])
+                print("packageName: " + app["packageName"])
+                print("categories:")
+                for cat in app["categories"]:
+                    print("\t" + cat)
         else:
-            logging.error("WayDroid container is {}".format(
-                session_cfg["session"]["state"]))
-    else:
+            logging.error("Failed to access IPlatform service")
+
+        if session["state"] == "FROZEN":
+            cm.Freeze()
+    except dbus.DBusException:
         logging.error("WayDroid session is stopped")
 
 def showFullUI(args):
@@ -115,7 +127,9 @@ def showFullUI(args):
                 statusBarService.expand()
                 time.sleep(0.5)
                 statusBarService.collapse()
-    maybeLaunchLater(args, showFullUI, justShow)
+        else:
+            logging.error("Failed to access IPlatform service")
+    maybeLaunchLater(args, justShow)
 
 def intent(args):
     def justLaunch():
@@ -136,4 +150,4 @@ def intent(args):
                     2, "policy_control", "immersive.full=*")
         else:
             logging.error("Failed to access IPlatform service")
-    maybeLaunchLater(args, intent, justLaunch)
+    maybeLaunchLater(args, justLaunch)