1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
From a533f2f19d47b4d6a58bcc34862277ba7497b09e Mon Sep 17 00:00:00 2001
From: Martchus <martchus@gmx.net>
Date: Sun, 31 Aug 2025 00:17:02 +0200
Subject: [PATCH 25/25] Revert "Re-land: Android: destroy the window surface
only after exit transition"
This reverts commit 5864dded15b05762699a0281c5b1e9bc52a1e0d5.
---
.../qt/android/QtActivityDelegate.java | 37 +++++++-------
.../org/qtproject/qt/android/QtWindow.java | 50 +------------------
.../android/qandroidplatformwindow.cpp | 11 ----
3 files changed, 18 insertions(+), 80 deletions(-)
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
index 15aaed7bfa9..699e925c8f0 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
@@ -9,11 +9,9 @@ import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
-import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.Rect;
-import android.graphics.Color;
import android.os.Build;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -43,6 +41,7 @@ class QtActivityDelegate extends QtActivityDelegateBase
private boolean m_splashScreenSticky = false;
private boolean m_backendsRegistered = false;
+ private View m_dummyView = null;
private final HashMap<Integer, View> m_nativeViews = new HashMap<>();
QtActivityDelegate(Activity activity)
@@ -205,19 +204,6 @@ class QtActivityDelegate extends QtActivityDelegateBase
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
m_layout.addView(m_splashScreen);
-
- // Set DayNight theme as layout background so splash screen
- // is not visible with opaque windows.
- TypedArray typedArray = m_activity.getTheme().obtainStyledAttributes(
- android.R.style.Theme_DeviceDefault_DayNight,
- new int[]{ android.R.attr.colorBackground });
- try {
- int backgroundColor = typedArray.getColor(0, Color.WHITE);
- Drawable background = new ColorDrawable(backgroundColor);
- m_layout.setBackground(background);
- } finally {
- typedArray.recycle();
- }
}
} catch (Exception e) {
e.printStackTrace();
@@ -395,9 +381,15 @@ class QtActivityDelegate extends QtActivityDelegateBase
if (m_layout == null)
return;
+ if (m_topLevelWindows.isEmpty()) {
+ if (m_dummyView != null) {
+ m_layout.removeView(m_dummyView);
+ m_dummyView = null;
+ }
+ }
+
m_layout.addView(window, m_topLevelWindows.size());
m_topLevelWindows.put(window.getId(), window);
- window.setToDestroy(false);
if (!m_splashScreenSticky)
hideSplashScreen();
});
@@ -411,10 +403,10 @@ class QtActivityDelegate extends QtActivityDelegateBase
if (m_topLevelWindows.containsKey(id)) {
QtWindow window = m_topLevelWindows.remove(id);
window.setOnApplyWindowInsetsListener(null); // Set in QtWindow for safe margins
- if (window.isFrontmostVisibleWindow()) {
- window.setToDestroy(true);
- // Keep current shown window open during shutdown transition
- m_layout.postDelayed(() -> { window.destroySurface(); }, 500);
+ if (m_topLevelWindows.isEmpty()) {
+ // Keep last frame in stack until it is replaced to get correct
+ // shutdown transition
+ m_dummyView = window;
} else if (m_layout != null) {
m_layout.removeView(window);
}
@@ -473,6 +465,11 @@ class QtActivityDelegate extends QtActivityDelegateBase
return;
QtNative.runAction(()-> {
+ if (m_dummyView != null) {
+ m_layout.removeView(m_dummyView);
+ m_dummyView = null;
+ }
+
if (m_nativeViews.containsKey(id))
m_layout.removeView(m_nativeViews.remove(id));
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
index 7a3db400f9e..1f5ae6c2ad9 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
@@ -20,7 +20,6 @@ import android.view.WindowInsets;
import android.os.Build;
import java.util.HashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
@SuppressLint("ViewConstructor")
class QtWindow extends QtLayout implements QtSurfaceInterface {
@@ -31,7 +30,6 @@ class QtWindow extends QtLayout implements QtSurfaceInterface {
private GestureDetector m_gestureDetector;
private final QtEditText m_editText;
private final QtInputConnection.QtInputConnectionListener m_inputConnectionListener;
- private final AtomicBoolean m_canBeDestroyed = new AtomicBoolean(true);
private static native void setSurface(int windowId, Surface surface);
private static native void safeAreaMarginsChanged(Insets insets, int id);
@@ -164,52 +162,6 @@ class QtWindow extends QtLayout implements QtSurfaceInterface {
});
}
- // Use only for Qt for Android and not Qt Quick for Android
- @UsedFromNativeCode
- public void setToDestroy(boolean destroy)
- {
- m_canBeDestroyed.set(destroy);
- }
- // Use only for Qt for Android and not Qt Quick for Android
- private QtLayout getParentContainer()
- {
- if (!(getParent() instanceof QtLayout))
- return null;
- return (QtLayout) getParent();
- }
- // Use only for Qt for Android and not Qt Quick for Android
- public boolean isFrontmostVisibleWindow()
- {
- QtLayout parent = getParentContainer();
- if (getVisibility() != View.VISIBLE || parent == null)
- return false;
- for (int index = parent.indexOfChild(this) + 1; index < parent.getChildCount(); index ++) {
- View child = parent.getChildAt(index);
- if (child instanceof QtWindow && child.isShown())
- return false;
- }
- return true;
- }
- // Use only for Qt for Android and not Qt Quick for Android
- @UsedFromNativeCode
- public boolean isLastVisibleTopLevelWindow()
- {
- QtLayout parent = getParentContainer();
- if (getVisibility() != View.VISIBLE || parent == null)
- return false;
- for (int index = parent.indexOfChild(this) - 1; index >= 0; index--) {
- View child = parent.getChildAt(index);
- if (child instanceof QtWindow) {
- QtWindow childWindow = (QtWindow) child;
- if (child.getVisibility() == View.VISIBLE && !childWindow.m_canBeDestroyed.get())
- return false;
- }
- }
- if (parent.getChildCount() > 1 && !isFrontmostVisibleWindow())
- return false;
- return true;
- }
-
@Override
public void onSurfaceChanged(Surface surface)
{
@@ -276,7 +228,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface {
void destroySurface()
{
QtNative.runAction(()-> {
- if (m_surfaceContainer != null && m_canBeDestroyed.get()) {
+ if (m_surfaceContainer != null) {
removeView(m_surfaceContainer);
m_surfaceContainer = null;
}
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp
index f20bb2be11c..e904145a7c9 100644
--- a/src/plugins/platforms/android/qandroidplatformwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp
@@ -168,17 +168,6 @@ void QAndroidPlatformWindow::setVisible(bool visible)
{
if (isEmbeddingContainer())
return;
-
- if (!visible && window()->isTopLevel()) {
- // Do not hide last Qt for Android window.
- // We don't want the splash screen to be shown during the app's
- // exit because it would be the foremost visible screen.
- if (QtAndroid::isQtApplication()) {
- visible = m_nativeQtWindow.callMethod<bool>("isLastVisibleTopLevelWindow");
- m_nativeQtWindow.callMethod<void>("setToDestroy", !visible);
- }
- }
-
m_nativeQtWindow.callMethod<void>("setVisible", visible);
if (visible) {
--
2.51.0
|