Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
QtEmbeddedDelegate.java
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4package org.qtproject.qt.android;
5
6import static org.qtproject.qt.android.QtNative.ApplicationState.*;
7
8import android.app.Activity;
9import android.app.Application;
10import android.content.res.Resources;
11import android.os.Build;
12import android.os.Bundle;
13import android.util.DisplayMetrics;
14import android.util.Log;
15import android.widget.PopupMenu;
16
17import java.util.HashSet;
18
19class QtEmbeddedDelegate extends QtActivityDelegateBase
20 implements QtNative.AppStateDetailsListener, QtEmbeddedViewInterface, QtWindowInterface,
22{
23 private static final String QtTAG = "QtEmbeddedDelegate";
24 private final HashSet<QtView> m_views = new HashSet<>();
25 private QtNative.ApplicationStateDetails m_stateDetails;
26 private boolean m_backendsRegistered = false;
27
28 QtEmbeddedDelegate(Activity context) {
29 super(context);
30 m_stateDetails = QtNative.getStateDetails();
31 QtNative.registerAppStateListener(this);
32
33 m_activity.getApplication().registerActivityLifecycleCallbacks(
34 new Application.ActivityLifecycleCallbacks() {
35 @Override
36 public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
37
38 @Override
39 public void onActivityStarted(Activity activity) {}
40
41 @Override
42 public void onActivityResumed(Activity activity) {
43 if (m_activity == activity && m_stateDetails.isStarted) {
44 QtNative.setApplicationState(ApplicationActive);
45 QtWindow.updateWindows();
46 }
47 }
48
49 @Override
50 public void onActivityPaused(Activity activity) {
51 if (m_activity == activity && m_stateDetails.isStarted) {
52 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N ||
53 !activity.isInMultiWindowMode()) {
54 QtNative.setApplicationState(ApplicationInactive);
55 }
56 }
57 }
58
59 @Override
60 public void onActivityStopped(Activity activity) {
61 if (m_activity == activity && m_stateDetails.isStarted) {
62 QtNative.setApplicationState(ApplicationSuspended);
63 }
64 }
65
66 @Override
67 public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
68
69 @Override
70 public void onActivityDestroyed(Activity activity) {
71 // If the Activity was destroyed due to a configuration change, it will be recreated
72 // instantly, so don't terminate Qt if that's the case
73 if (m_activity == activity && m_stateDetails.isStarted &&
74 !activity.isChangingConfigurations()) {
75 m_activity.getApplication().unregisterActivityLifecycleCallbacks(this);
76 QtNative.unregisterAppStateListener(QtEmbeddedDelegate.this);
77 QtEmbeddedViewInterfaceFactory.remove(m_activity);
78 QtNative.terminateQtNativeApplication();
79 QtNative.setActivity(null);
80 }
81 }
82 });
83 }
84
85 @Override
86 public void onAppStateDetailsChanged(QtNative.ApplicationStateDetails details) {
87 synchronized (this) {
88 m_stateDetails = details;
89 if (details.isStarted && !m_backendsRegistered) {
90 if (BackendRegister.isNull())
91 return;
92
93 m_backendsRegistered = true;
94 BackendRegister.registerBackend(QtWindowInterface.class, this);
95 BackendRegister.registerBackend(QtMenuInterface.class, this);
96 BackendRegister.registerBackend(QtInputInterface.class, m_inputDelegate);
97 } else if (!details.isStarted && m_backendsRegistered) {
98 m_backendsRegistered = false;
99
100 if (BackendRegister.isNull())
101 return;
102
103 BackendRegister.unregisterBackend(QtWindowInterface.class);
104 BackendRegister.unregisterBackend(QtMenuInterface.class);
105 BackendRegister.unregisterBackend(QtInputInterface.class);
106 }
107 }
108 }
109
110 @Override
111 public void onNativePluginIntegrationReadyChanged(boolean ready)
112 {
113 if (ready) {
114 QtNative.runAction(() -> {
115 DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
116 QtDisplayManager.handleLayoutSizeChanged(metrics.widthPixels, metrics.heightPixels);
117 m_displayManager.initDisplayProperties();
118 });
119 }
120 }
121
122 @Override
123 void startNativeApplicationImpl(String appParams, String mainLib)
124 {
125 QtNative.startApplication(appParams, mainLib);
126 }
127
128 // QtEmbeddedViewInterface implementation begin
129 @Override
130 public void startQtApplication(String appParams, String mainLib)
131 {
132 super.startNativeApplication(appParams, mainLib);
133 }
134
135 @Override
136 public void addView(QtView view)
137 {
138 if (m_views.add(view)) {
139 QtNative.runAction(() -> createRootWindow(view));
140 }
141 }
142
143 @Override
144 public void removeView(QtView view)
145 {
146 m_views.remove(view);
147 }
148 // QtEmbeddedViewInterface implementation end
149
150 // This gets called from Android thread
151 private void createRootWindow(QtView view) {
152 // No use in creating a QQuickView for a View that has been removed
153 if (m_views.contains(view)) {
154 QtView.createRootWindow(view, view.getLeft(), view.getTop(), view.getWidth(),
155 view.getHeight());
156 }
157 }
158
159 // QtMenuInterface implementation begin
160 @Override
161 public void resetOptionsMenu() { QtNative.runAction(m_activity::invalidateOptionsMenu); }
162
163 @Override
164 public void openOptionsMenu() { QtNative.runAction(m_activity::openOptionsMenu); }
165
166 @Override
167 public void closeContextMenu() { QtNative.runAction(m_activity::closeContextMenu); }
168
169 @Override
170 public void openContextMenu(final int x, final int y, final int w, final int h)
171 {
172 final QtEditText focusedEditText = m_inputDelegate.getCurrentQtEditText();
173 if (focusedEditText == null) {
174 Log.w(QtTAG, "No focused view when trying to open context menu");
175 return;
176 }
177 focusedEditText.postDelayed(() -> {
178 PopupMenu popup = new PopupMenu(m_activity, focusedEditText);
179 QtNative.fillContextMenu(popup.getMenu());
180 popup.setOnMenuItemClickListener(m_activity::onContextItemSelected);
181 popup.setOnDismissListener(popupMenu ->
182 m_activity.onContextMenuClosed(popupMenu.getMenu()));
183 popup.show();
184 }, 100);
185 }
186 // QtMenuInterface implementation end
187}
static const QString context()
Definition java.cpp:398
QMap< Name, StatePointer > Bundle
Definition lalr.h:46
Q_CORE_EXPORT QtJniTypes::Activity activity()
void createRootWindow(JNIEnv *, jclass, QtJniTypes::View rootView, jint x, jint y, jint width, jint height)
GLint GLint GLint GLint GLint x
GLfloat GLfloat GLfloat w
[0]
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLint y
GLfloat GLfloat GLfloat GLfloat h
QQuickView * view
[0]