mirror of
https://github.com/waydroid/waydroid.git
synced 2026-04-29 11:25:15 -04:00
154 lines
5.4 KiB
Python
154 lines
5.4 KiB
Python
# Copyright 2021 Erfan Abdi
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import logging
|
|
import os
|
|
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):
|
|
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("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):
|
|
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("Failed to access IPlatform service")
|
|
|
|
if session["state"] == "FROZEN":
|
|
cm.Freeze()
|
|
except dbus.DBusException:
|
|
logging.error("WayDroid session is stopped")
|
|
|
|
def maybeLaunchLater(args, launchNow):
|
|
try:
|
|
tools.helpers.ipc.DBusSessionService()
|
|
try:
|
|
tools.helpers.ipc.DBusContainerService().Unfreeze()
|
|
except Exception:
|
|
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, launchNow, background=False)
|
|
|
|
def launch(args):
|
|
def justLaunch():
|
|
platformService = IPlatform.get_service(args)
|
|
if platformService:
|
|
platformService.setprop("waydroid.active_apps", args.PACKAGE)
|
|
platformService.launchApp(args.PACKAGE)
|
|
multiwin = platformService.getprop(
|
|
"persist.waydroid.multi_windows", "false")
|
|
if multiwin == "false":
|
|
platformService.settingsPutString(
|
|
2, "policy_control", "immersive.status=*")
|
|
else:
|
|
platformService.settingsPutString(
|
|
2, "policy_control", "immersive.full=*")
|
|
else:
|
|
logging.error("Failed to access IPlatform service")
|
|
maybeLaunchLater(args, justLaunch)
|
|
|
|
def list(args):
|
|
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("Failed to access IPlatform service")
|
|
|
|
if session["state"] == "FROZEN":
|
|
cm.Freeze()
|
|
except dbus.DBusException:
|
|
logging.error("WayDroid session is stopped")
|
|
|
|
def showFullUI(args):
|
|
def justShow():
|
|
platformService = IPlatform.get_service(args)
|
|
if platformService:
|
|
platformService.setprop("waydroid.active_apps", "Waydroid")
|
|
platformService.settingsPutString(2, "policy_control", "null*")
|
|
# HACK: Refresh display contents
|
|
statusBarService = IStatusBarService.get_service(args)
|
|
if statusBarService:
|
|
statusBarService.expand()
|
|
time.sleep(0.5)
|
|
statusBarService.collapse()
|
|
else:
|
|
logging.error("Failed to access IPlatform service")
|
|
maybeLaunchLater(args, justShow)
|
|
|
|
def intent(args):
|
|
def justLaunch():
|
|
platformService = IPlatform.get_service(args)
|
|
if platformService:
|
|
ret = platformService.launchIntent(args.ACTION, args.URI)
|
|
if ret == "":
|
|
return
|
|
pkg = ret if ret != "android" else "Waydroid"
|
|
platformService.setprop("waydroid.active_apps", pkg)
|
|
multiwin = platformService.getprop(
|
|
"persist.waydroid.multi_windows", "false")
|
|
if multiwin == "false":
|
|
platformService.settingsPutString(
|
|
2, "policy_control", "immersive.status=*")
|
|
else:
|
|
platformService.settingsPutString(
|
|
2, "policy_control", "immersive.full=*")
|
|
else:
|
|
logging.error("Failed to access IPlatform service")
|
|
maybeLaunchLater(args, justLaunch)
|