From 190e3200e0f7673d5adf2ff0b0164229319d2fb3 Mon Sep 17 00:00:00 2001 From: Gabriel Brown Date: Mon, 17 Aug 2026 13:42:31 -0400 Subject: [PATCH] Keep offline phone capabilities visible --- .../dot/quickshell/scripts/panama-kdeconnect | 23 +++++++++++++++- tests/quickshell/kdeconnect_bridge_test.py | 27 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/config/dot/quickshell/scripts/panama-kdeconnect b/config/dot/quickshell/scripts/panama-kdeconnect index 79b67e0..fbbf5f5 100755 --- a/config/dot/quickshell/scripts/panama-kdeconnect +++ b/config/dot/quickshell/scripts/panama-kdeconnect @@ -142,6 +142,27 @@ def loaded_plugins(device_id: str, runner: Runner = subprocess.run) -> list[str] return parse_loaded_plugins(result.stdout) if result.returncode == 0 else [] +def supported_plugins(device_id: str, runner: Runner = subprocess.run) -> list[str]: + result = run_command( + [ + "busctl", + "--user", + "get-property", + "org.kde.kdeconnect", + device_object(device_id), + "org.kde.kdeconnect.device", + "supportedPlugins", + ], + runner=runner, + ) + return parse_loaded_plugins(result.stdout) if result.returncode == 0 else [] + + +def device_plugins(device_id: str, runner: Runner = subprocess.run) -> list[str]: + active = loaded_plugins(device_id, runner) + return active if active else supported_plugins(device_id, runner) + + def reported_type(device_id: str, runner: Runner = subprocess.run) -> str: result = run_command( [ @@ -181,7 +202,7 @@ def collect_status(runner: Runner = subprocess.run) -> dict[str, object]: try: device = normalize_device_line( line, - loaded_plugins(device_id, runner), + device_plugins(device_id, runner), reported_type(device_id, runner), ) except ValueError: diff --git a/tests/quickshell/kdeconnect_bridge_test.py b/tests/quickshell/kdeconnect_bridge_test.py index 3a33f45..18c553d 100644 --- a/tests/quickshell/kdeconnect_bridge_test.py +++ b/tests/quickshell/kdeconnect_bridge_test.py @@ -6,6 +6,7 @@ import importlib.machinery import importlib.util import json import pathlib +import subprocess import tempfile import unittest @@ -103,6 +104,32 @@ class KdeConnectBridgeTest(unittest.TestCase): ], ) + def test_offline_device_falls_back_to_supported_plugins(self) -> None: + def runner(command: list[str], **_kwargs: object) -> subprocess.CompletedProcess[str]: + member = command[-1] + if member == "loadedPlugins": + return subprocess.CompletedProcess(command, 0, "as 0\n", "") + if member == "supportedPlugins": + return subprocess.CompletedProcess( + command, + 0, + 'as 3 "kdeconnect_share" "kdeconnect_clipboard" "kdeconnect_findmyphone"\n', + "", + ) + raise AssertionError(command) + + self.assertEqual( + bridge.device_plugins( + "90B54E84548E4F109268EC2D0E7D6930", + runner, + ), + [ + "kdeconnect_share", + "kdeconnect_clipboard", + "kdeconnect_findmyphone", + ], + ) + if __name__ == "__main__": unittest.main()