What changed, and why it matters
This commit adjusts on-screen spacing for the Android version of the Electrum wallet app so that dialog boxes avoid overlapping with the phone's system status and navigation bars. It is a user-interface layout fix, not a security patch. There is no indication it fixes a vulnerability or changes how funds, keys, or passwords are protected.
No security action needed; treat as a normal UI/layout update.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change adds a needsSystemBarPadding property to the QML ElDialog base control. When true, dialogs reserve top padding equal to app.statusBarHeight and bottom padding equal to app.navigationBarHeight to support Android edge-to-edge mode. Most existing dialog subclasses explicitly set needsSystemBarPadding: false to keep their previous layout. A small profiler threshold change in qeapp.py is also included. No cryptographic, network, authentication, or storage logic is modified.
Changed components
electrum/gui/qml/components/controls/ElDialog.qmlelectrum/gui/qml/qeapp.pyvarious QML dialog componentsInspect captured patch +26 / −1
diff --git a/electrum/gui/qml/components/BIP39RecoveryDialog.qml b/electrum/gui/qml/components/BIP39RecoveryDialog.qml
index cda047a..6910d3d 100644
--- a/electrum/gui/qml/components/BIP39RecoveryDialog.qml
+++ b/electrum/gui/qml/components/BIP39RecoveryDialog.qml
@@ -18,6 +18,8 @@ ElDialog {
property string derivationPath
property string scriptType
+ needsSystemBarPadding: false
+
z: 1 // raise z so it also covers wizard dialog
anchors.centerIn: parent
diff --git a/electrum/gui/qml/components/LnurlPayRequestDialog.qml b/electrum/gui/qml/components/LnurlPayRequestDialog.qml
index ce6b85f..338dc08 100644
--- a/electrum/gui/qml/components/LnurlPayRequestDialog.qml
+++ b/electrum/gui/qml/components/LnurlPayRequestDialog.qml
@@ -16,6 +16,7 @@ ElDialog {
property InvoiceParser invoiceParser
padding: 0
+ needsSystemBarPadding: false
property bool commentValid: comment.text.length <= invoiceParser.lnurlData['comment_allowed']
property bool amountValid: amountBtc.textAsSats.satsInt >= parseInt(invoiceParser.lnurlData['min_sendable_sat'])
diff --git a/electrum/gui/qml/components/LoadingWalletDialog.qml b/electrum/gui/qml/components/LoadingWalletDialog.qml
index f40327f..2cd07ac 100644
--- a/electrum/gui/qml/components/LoadingWalletDialog.qml
+++ b/electrum/gui/qml/components/LoadingWalletDialog.qml
@@ -18,6 +18,7 @@ ElDialog {
x: Math.floor((parent.width - implicitWidth) / 2)
y: Math.floor((parent.height - implicitHeight) / 2)
// anchors.centerIn: parent // this strangely pixelates the spinner
+ needsSystemBarPadding: false
function open() {
showTimer.start()
diff --git a/electrum/gui/qml/components/MessageDialog.qml b/electrum/gui/qml/components/MessageDialog.qml
index e80d4bb..a2211ff 100644
--- a/electrum/gui/qml/components/MessageDialog.qml
+++ b/electrum/gui/qml/components/MessageDialog.qml
@@ -21,6 +21,7 @@ ElDialog {
anchors.centerIn: parent
padding: 0
+ needsSystemBarPadding: false
width: rootLayout.width
diff --git a/electrum/gui/qml/components/NostrSwapServersDialog.qml b/electrum/gui/qml/components/NostrSwapServersDialog.qml
index 384789e..3330d78 100644
--- a/electrum/gui/qml/components/NostrSwapServersDialog.qml
+++ b/electrum/gui/qml/components/NostrSwapServersDialog.qml
@@ -15,6 +15,8 @@ ElDialog {
property string selectedPubkey
+ needsSystemBarPadding: false
+
anchors.centerIn: parent
padding: 0
diff --git a/electrum/gui/qml/components/OpenWalletDialog.qml b/electrum/gui/qml/components/OpenWalletDialog.qml
index 59319bc..b6209de 100644
--- a/electrum/gui/qml/components/OpenWalletDialog.qml
+++ b/electrum/gui/qml/components/OpenWalletDialog.qml
@@ -25,6 +25,7 @@ ElDialog {
anchors.centerIn: parent
padding: 0
+ needsSystemBarPadding: false
ColumnLayout {
spacing: 0
diff --git a/electrum/gui/qml/components/PasswordDialog.qml b/electrum/gui/qml/components/PasswordDialog.qml
index 442f44a..71a43d9 100644
--- a/electrum/gui/qml/components/PasswordDialog.qml
+++ b/electrum/gui/qml/components/PasswordDialog.qml
@@ -20,6 +20,7 @@ ElDialog {
anchors.centerIn: parent
width: parent.width * 4/5
padding: 0
+ needsSystemBarPadding: false
ColumnLayout {
id: rootLayout
diff --git a/electrum/gui/qml/components/Pin.qml b/electrum/gui/qml/components/Pin.qml
index 261a375..1f222c0 100644
--- a/electrum/gui/qml/components/Pin.qml
+++ b/electrum/gui/qml/components/Pin.qml
@@ -25,6 +25,7 @@ ElDialog {
focus: true
closePolicy: canCancel ? Popup.CloseOnEscape | Popup.CloseOnPressOutside : Popup.NoAutoClose
allowClose: canCancel
+ needsSystemBarPadding: false
anchors.centerIn: parent
diff --git a/electrum/gui/qml/components/ReceiveDetailsDialog.qml b/electrum/gui/qml/components/ReceiveDetailsDialog.qml
index 136af00..ab00091 100644
--- a/electrum/gui/qml/components/ReceiveDetailsDialog.qml
+++ b/electrum/gui/qml/components/ReceiveDetailsDialog.qml
@@ -20,6 +20,7 @@ ElDialog {
property bool isLightning: false
padding: 0
+ needsSystemBarPadding: false
ColumnLayout {
width: parent.width
diff --git a/electrum/gui/qml/components/controls/ElDialog.qml b/electrum/gui/qml/components/controls/ElDialog.qml
index 1a3abd4..74bd44c 100644
--- a/electrum/gui/qml/components/controls/ElDialog.qml
+++ b/electrum/gui/qml/components/controls/ElDialog.qml
@@ -9,11 +9,16 @@ Dialog {
property bool allowClose: true
property string iconSource
property bool resizeWithKeyboard: true
+ // inheriting classes can set needsSystemBarPadding this false to disable padding
+ property bool needsSystemBarPadding: true
property bool _result: false
// workaround: remember opened state, to inhibit closed -> closed event
property bool _wasOpened: false
+ // Add bottom padding for Android navigation bar if needed
+ bottomPadding: needsSystemBarPadding ? app.navigationBarHeight : 0
+
// called to finally close dialog after checks by onClosing handler in main.qml
function doClose() {
doReject()
@@ -65,6 +70,13 @@ Dialog {
header: ColumnLayout {
spacing: 0
+ // Add top padding for status bar on Android when using edge-to-edge
+ Item {
+ visible: needsSystemBarPadding && app.statusBarHeight > 0
+ Layout.fillWidth: true
+ Layout.preferredHeight: app.statusBarHeight
+ }
+
RowLayout {
spacing: 0
diff --git a/electrum/gui/qml/components/controls/HelpDialog.qml b/electrum/gui/qml/components/controls/HelpDialog.qml
index f11a0d1..8d1b87d 100644
--- a/electrum/gui/qml/components/controls/HelpDialog.qml
+++ b/electrum/gui/qml/components/controls/HelpDialog.qml
@@ -16,6 +16,7 @@ ElDialog {
anchors.centerIn: parent
padding: 0
+ needsSystemBarPadding: false
width: rootPane.width
diff --git a/electrum/gui/qml/qeapp.py b/electrum/gui/qml/qeapp.py
index 28764c0..3232cf6 100644
--- a/electrum/gui/qml/qeapp.py
+++ b/electrum/gui/qml/qeapp.py
@@ -422,7 +422,7 @@ class QEAppController(BaseCrashReporter, QObject):
return False
return bool(systemSdkVersion >= 35)
- @profiler(min_threshold=0.05)
+ @profiler(min_threshold=0.02)
def _getSystemBarHeight(self, bar_type: str) -> int:
if not self.enforcesEdgeToEdge():
return 0
diff --git a/electrum/plugins/psbt_nostr/qml/PsbtReceiveDialog.qml b/electrum/plugins/psbt_nostr/qml/PsbtReceiveDialog.qml
index 286324f..bb59d3f 100644
--- a/electrum/plugins/psbt_nostr/qml/PsbtReceiveDialog.qml
+++ b/electrum/plugins/psbt_nostr/qml/PsbtReceiveDialog.qml
@@ -26,6 +26,7 @@ ElDialog {
anchors.centerIn: parent
padding: 0
+ needsSystemBarPadding: false
width: rootLayout.width
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.