* fix(phone-connect): zh-Hans locale, switcher aliasMap, box padding - Rename zh_hans -> zh-Hans (plugin.toml value, en.json key) and add the missing translations/zh-Hans.json. The zh_hans tag does not match BCP 47, so the framework's materialize step dropped the Chinese translation file and t() returned raw dot keys in the UI. - Add missing aliasMap definition in switcher() so the multi-device panel no longer errors on aliasMap[id]. Fixes #176. - Replace ui.box({padding=...}) with ui.row({padding=...}); box does not support the padding prop, causing ui-tree warnings on open. Supersedes #190 (which covers only the aliasMap fix). * fix(phone-connect): volume quoting, config data loss, interval, dead settings, slider, UI issues 1. media_set_volume: shellQuote the <int32> variant arg (was unquoted, shell treated < as redirect; same fix as media_seek). 2. onConfigChanged: track last-applied custom_image/device_alias values so unrelated config edits (e.g. language switch) no longer wipe a device's image/alias. Seed trackers at init so reload is safe too. 3. state_update_interval=0: return 3600000ms + guard in update() to skip auto-refresh, matching the '0 disables' description. 4. Remove 4 dead settings (show_ongoing_media, show_device_placeholder, scan_subdirectories, max_recent_images) declared but never read, plus orphan recent_images translation keys. 5. Media slider: freeze value during drag via per-device dragState so the 1s service refresh doesn't yank the slider back. Also fixes onDragEnd seeking to a stale seekPos. 6. Minor: runCli reports cli_failed not no_backend; browse uses runAsync not runInTerminal; charging color priority over low-battery; device name falls back to d.name; fix comment mismatches. * chore: bump version to 0.1.1 * fix: use lowercase zh-hans translation key to pass CI validation CI rejects uppercase in translation keys (zh-Hans). The translation key and label_key are now lowercase zh-hans, while the file name stays zh-Hans.json (required by the framework's materialize step) and the select value stays zh-Hans (used to build the file path).
Phone Connect
Control your KDE Connect-paired phone from the Noctalia bar.
Plugin
| Entry | Type | Id |
|---|---|---|
icefish/phone-connect |
plugin | — |
bar |
widget | icefish/phone-connect:bar |
tile |
shortcut | icefish/phone-connect:tile |
details |
panel | icefish/phone-connect:details |
details_floating |
panel | icefish/phone-connect:details_floating |
details_widget |
panel | icefish/phone-connect:details_widget |
kde |
service | icefish/phone-connect:kde |
Usage
Add the bar widget and control-center tile from Settings, then click either to open the details panel.
Open panels from the shell:
noctalia msg panel-toggle icefish/phone-connect:details
noctalia msg panel-toggle icefish/phone-connect:details_floating
noctalia msg panel-toggle icefish/phone-connect:details_widget
Send IPC events to the service:
noctalia msg plugin icefish/phone-connect:kde all refresh
noctalia msg plugin icefish/phone-connect:kde all cmd '{"op":"ring","device":"<id>"}'
Features
- Device status — battery level, charging state, network type (5G/LTE), pairing
- Quick actions — ring, ping, send clipboard, share text/files/URLs, SMS, SFTP browser
- Media control — play/pause/skip/seek, album art, now-playing (MPRIS)
- Customization — per-device image and alias, three panel placements
- Language — English / Simplified Chinese
Requirements
kdeconnect— KDE Connect daemon and CLIgdbus— ships with glib2sshfs— optional, for phone file browsing
Settings
| Setting | Default | Description |
|---|---|---|
| State Update Interval | 30 | Seconds between device refreshes |
| Show Charging Fill | true | Highlight bar widget when charging |
| Show Clipboard Action | true | Show clipboard button in panel |
| Device Image | — | Custom image for selected device |
| Device Alias | Your-Phone | Custom display name |
| Language | en | English / 简体中文 |
| Panel Placement | attached | Attached / Floating center / Below widget |
IPC
| Event | Payload | Description |
|---|---|---|
refresh |
— | Full device refresh |
cmd |
JSON {"op":"…","device":"…"} |
Execute an operation |
Supported ops: ring, ping, clipboard, share_text, share_url, share_file, pair, accept, reject, unpair, browse, sms_send, launch_sms_app, media, media_seek, select, refresh, set_image.
Notes
- Communicates with KDE Connect via DBus (
gdbus call) and CLI (kdeconnect-cli) - Persists user preferences to
pluginDataDir()/state.json - No external network requests; all logic runs locally