Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
7
8import android.app.Activity;
9import android.app.Application;
10import android.content.Context;
11import android.content.res.Resources;
12import android.os.Build;
13import android.os.Bundle;
14import android.os.Handler;
15import android.os.Looper;
16import android.util.DisplayMetrics;
17import android.util.Log;
18import android.view.View;
19import android.view.ViewGroup;
20
21import java.util.ArrayList;
22import java.util.HashMap;
23
24class QtEmbeddedDelegate extends QtActivityDelegateBase
25 implements QtNative.AppStateDetailsListener, QtEmbeddedViewInterface
26{
27 // TODO simplistic implementation with one QtView, expand to support multiple views QTBUG-117649
28 private QtView m_view;
29 private QtNative.ApplicationStateDetails m_stateDetails;
30 private boolean m_windowLoaded = false;
31
32 public QtEmbeddedDelegate(Activity context) {
33 super(context);
34
35 m_stateDetails = QtNative.getStateDetails();
36 QtNative.registerAppStateListener(this);
37
38 m_activity.getApplication().registerActivityLifecycleCallbacks(
39 new Application.ActivityLifecycleCallbacks() {
40 @Override
41 public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
42
43 @Override
44 public void onActivityStarted(Activity activity) {}
45
46 @Override
47 public void onActivityResumed(Activity activity) {
48 if (m_activity == activity && m_stateDetails.isStarted) {
49 QtNative.setApplicationState(ApplicationActive);
50 QtNative.updateWindow();
51 }
52 }
53
54 @Override
55 public void onActivityPaused(Activity activity) {
56 if (m_activity == activity && m_stateDetails.isStarted) {
57 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N ||
58 !activity.isInMultiWindowMode()) {
59 QtNative.setApplicationState(ApplicationInactive);
60 }
61 }
62 }
63
64 @Override
65 public void onActivityStopped(Activity activity) {
66 if (m_activity == activity && m_stateDetails.isStarted) {
67 QtNative.setApplicationState(ApplicationSuspended);
68 }
69 }
70
71 @Override
72 public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
73
74 @Override
75 public void onActivityDestroyed(Activity activity) {
76 if (m_activity == activity && m_stateDetails.isStarted) {
77 m_activity.getApplication().unregisterActivityLifecycleCallbacks(this);
78 QtNative.unregisterAppStateListener(QtEmbeddedDelegate.this);
79 QtEmbeddedDelegateFactory.remove(m_activity);
80 QtNative.terminateQt();
81 QtNative.setActivity(null);
82 QtNative.getQtThread().exit();
83 }
84 }
85 });
86 }
87
88 @Override
89 public void onAppStateDetailsChanged(QtNative.ApplicationStateDetails details) {
90 synchronized (this) {
91 m_stateDetails = details;
92 }
93 }
94
95 @Override
96 public void onNativePluginIntegrationReadyChanged(boolean ready)
97 {
98 synchronized (this) {
99 if (ready) {
100 QtNative.runAction(() -> {
101 DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
102 QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels,
103 metrics.heightPixels);
104
105 });
107 }
108 }
109 }
110
111 @Override
112 void startNativeApplicationImpl(String appParams, String mainLib)
113 {
114 QtNative.startApplication(appParams, mainLib);
115 }
116
117 @Override
118 QtAccessibilityDelegate createAccessibilityDelegate()
119 {
120 // FIXME make QtAccessibilityDelegate window based or verify current way works
121 // also for child windows: QTBUG-120685
122 return null;
123 }
124
125 @UsedFromNativeCode
126 @Override
127 QtLayout getQtLayout()
128 {
129 // TODO verify if returning m_view here works, this is used by the androidjniinput
130 // when e.g. showing a keyboard, so depends on getting the keyboard focus working
131 // QTBUG-118873
132 if (m_view == null)
133 return null;
134 return m_view.getQtWindow();
135 }
136
137 // QtEmbeddedViewInterface implementation begin
138 @Override
139 public void startQtApplication(String appParams, String mainLib)
140 {
141 super.startNativeApplication(appParams, mainLib);
142 }
143
144 @Override
145 public void queueLoadWindow()
146 {
147 synchronized (this) {
148 if (m_stateDetails.nativePluginIntegrationReady)
150 }
151 }
152
153 @Override
154 public void setView(QtView view)
155 {
156 m_view = view;
157 updateInputDelegate();
158 if (m_view != null)
159 registerGlobalFocusChangeListener(m_view);
160 }
161 // QtEmbeddedViewInterface implementation end
162
163 private void updateInputDelegate() {
164 if (m_view == null) {
165 m_inputDelegate.setEditPopupMenu(null);
166 return;
167 }
168 m_inputDelegate.setEditPopupMenu(new EditPopupMenu(m_activity, m_view));
169 }
170
171 private void createRootWindow() {
172 if (m_view != null && !m_windowLoaded) {
173 QtView.createRootWindow(m_view, m_view.getLeft(), m_view.getTop(), m_view.getWidth(),
174 m_view.getHeight());
175 m_windowLoaded = true;
176 }
177 }
178}
static QtJniTypes::QtInputDelegate m_inputDelegate
static void startQtApplication(JNIEnv *, jclass)
Q_CORE_EXPORT QtJniTypes::Activity activity()
void createRootWindow(JNIEnv *, jclass, QtJniTypes::View rootView, jint x, jint y, jint width, jint height)
static void * context
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
QQuickView * view
[0]