Package: plasma-mobile
Version: 6.3.6-3
Severity: important
Tags: trixie fixed-upstream patch

On trixie, switching Do Not Disturb off in Plasma Mobile's quick settings
leaves the Notification Sounds stream muted. That stream carries the
ringtone, so calls ring without sound until the stream is unmuted by hand
in the volume panel. This is fixed upstream since Plasma 6.4.5 and in forky
and sid (6.7.4-2). The fix is a small QML change, and a patch for 6.3.6 is
attached. Please consider it for a trixie stable update.

System: Mobian 13 (trixie) with Plasma Mobile, on a Fairphone 5. Related
packages: plasma-workspace and libnotificationmanager1 4:6.3.6-2, plasma-pa
4:6.3.4-1, libkf6pulseaudioqt5 1.7.0-1, libkf6configcore6 6.13.0-2,
pipewire-pulse 1.4.2-1, wireplumber 0.5.8-2, plasma-dialer 1:6.3.5-1.

## Steps to reproduce

1. With Notification Sounds not muted, switch Do Not Disturb on in the
quick settings.
2. Call the phone: it rings with neither sound nor vibration, as expected.
3. Switch Do Not Disturb off in the quick settings.
4. Call the phone again.

Expected: the ringtone plays again, as before step 1.

Actual: the call rings without sound. The Notification Sounds stream stays
muted until it is unmuted by hand in the volume panel; then the ringtone
plays again. Seen twice on 2026-10-20.

## What the phone shows

- With Do Not Disturb on, `~/.config/plasmanotifyrc` holds:

  ```
  [DoNotDisturb]
  NotificationSoundsMuted=true
  Until=2027,10,20,16,9,47.079
  ```

- After switching it off, the `[DoNotDisturb]` group is gone and the file
is empty: nothing in it says the stream was muted by Do Not Disturb.
- PipeWire still has the stream muted: `pw-metadata -n route-settings`
shows `restore.stream.Output/Audio.media.role:Notification` = `{ "mute":
true, "volumes": [ 1.000000, 1.000000 ], "channels": [ "FL", "FR" ] }`, and
WirePlumber's `~/.local/state/wireplumber/stream-properties` has
`Output/Audio:media.role:Notification={... "mute":true ...}`.

## Cause (from the 6.3.6 sources)

-
`components/mobileshell/qml/notificationpopup/NotificationPopupProvider.qml`
has its own `NotificationManager.Settings` (line 27). When Do Not Disturb
starts, it mutes the notification stream and records that in
`NotificationSoundsMuted`. When Do Not Disturb ends, `onInhibitedChanged`
(line 72) unmutes the stream only if `notificationSoundsInhibited` is still
true (lines 91-94).
- The quick setting goes through `ShellDBusClient.doNotDisturb` to
`onDoNotDisturbChanged` in
`components/mobileshell/qml/widgets/notifications/NotificationsWidget.qml`
(line 127), which calls `toggleDoNotDisturbMode()` (line 103). To switch Do
Not Disturb off, that calls `notificationSettings.defaults()` (line 105)
and then `save()`. This widget uses a separate
`NotificationManager.Settings {}`, set by the panel
(`containments/panel/package/contents/ui/main.qml:262`).
- `Settings::defaults()` in libnotificationmanager (plasma-workspace 6.3.6,
`libnotificationmanager/settings.cpp:260-268`) resets the whole Do Not
Disturb group, `NotificationSoundsMuted` included (default false in
`kcfg/donotdisturbsettings.kcfg`), and the notification, job and badge
settings too. `save()` then writes these defaults.
- The popup provider's Settings watches the file (KConfigWatcher,
`settings.cpp:284-289`) and reloads the Do Not Disturb group. It sees
`Until` gone and `NotificationSoundsMuted` false at the same time, so it
never unmutes the stream.

## Fix

Upstream commit [54cd4d548e84](
https://invent.kde.org/plasma/plasma-mobile/-/commit/54cd4d548e847e23661c894f2d5359564dc92fcf)
("notifications: Ensure correct state is being set for do not disturb",
Devin Lin, 2025-08-07) replaces `toggleDoNotDisturbMode()` with
`setDoNotDisturbMode(doNotDisturb)`. To switch Do Not Disturb off, the new
function clears `notificationsInhibitedUntil` and calls
`revokeApplicationInhibitions()` instead of `defaults()`.
`NotificationSoundsMuted` therefore stays true until the popup provider has
unmuted the stream. The commit is in v6.5.0 and later, and in v6.4.5 and
v6.4.6 as [841920e525d4](
https://invent.kde.org/plasma/plasma-mobile/-/commit/841920e525d430b8ba9791f6eb2934a0f4a0c7d7).
The Plasma/6.3 branch never got it: v6.3.6 was its last release.

The attached patch is that commit for 6.3.6, with one line dropped:
`notificationSettings.fullscreenFocused = false;`. libnotificationmanager
6.3.6's `Settings` has no `fullscreenFocused` property. The patch applies
to 6.3.6 with `patch -p1`. It has not been tried on the phone yet.

*This report was researched and written by Claude (Anthropic's AI model),
working with the phone's owner, who switched Do Not Disturb, placed the
calls, and reviewed the report before it was sent.*
From: Devin Lin <[email protected]>
Date: Thu, 7 Aug 2025 12:10:37 -0400
Subject: notifications: Ensure correct state is being set for do not disturb

Change the "toggleDoNotDisturbMode" function to "setDoNotDisturbMode"
and add a parameter so that we actually set the mode to the intended
value, not just flip it.

Backported to 6.3.6: the line setting notificationSettings.fullscreenFocused
is dropped, as libnotificationmanager 6.3 has no such property.

Origin: backport, https://invent.kde.org/plasma/plasma-mobile/-/commit/54cd4d548e847e23661c894f2d5359564dc92fcf
Applied-Upstream: 6.4.5, https://invent.kde.org/plasma/plasma-mobile/-/commit/841920e525d430b8ba9791f6eb2934a0f4a0c7d7
Last-Update: 2026-10-20
---
--- a/components/mobileshell/qml/widgets/notifications/NotificationsWidget.qml
+++ b/components/mobileshell/qml/widgets/notifications/NotificationsWidget.qml
@@ -98,12 +98,20 @@
     }
 
     /**
-     * Toggles Do Not Disturb mode.
+     * Sets Do Not Disturb mode to the intended setting.
+     * Note: The state may not change to the desired setting, always read doNotDisturbEnabled for the current state.
      */
-    function toggleDoNotDisturbMode() {
-        if (doNotDisturbModeEnabled) {
-            notificationSettings.defaults();
+    function setDoNotDisturbMode(doNotDisturb: bool) {
+        if (!doNotDisturb) {
+            // Turn off do not disturb
+
+            notificationSettings.notificationsInhibitedUntil = undefined;
+            notificationSettings.revokeApplicationInhibitions();
+            // overrules current mirrored screen setup, updates again when screen configuration changes
+            notificationSettings.screensMirrored = false;
+
         } else {
+            // Turn on do not disturb
             // We just have a global toggle, so set it to a really long time (in this case, a year)
             var until = new Date();
             until.setFullYear(until.getFullYear() + 1);
@@ -126,7 +134,7 @@
 
         function onDoNotDisturbChanged() {
             if (root.doNotDisturbModeEnabled !== MobileShellState.ShellDBusClient.doNotDisturb) {
-                root.toggleDoNotDisturbMode();
+                root.setDoNotDisturbMode(MobileShellState.ShellDBusClient.doNotDisturb);
             }
         }
     }

Reply via email to