4package org.qtproject.qt.android;
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.Menu;
19import android.view.View;
20import android.view.ViewGroup;
21import android.widget.PopupMenu;
23import java.util.ArrayList;
24import java.util.HashMap;
26class QtEmbeddedDelegate
extends QtActivityDelegateBase
27 implements QtNative.AppStateDetailsListener, QtEmbeddedViewInterface, QtWindowInterface,
28 QtMenuInterface, QtLayoutInterface
30 private static final String QtTAG =
"QtEmbeddedDelegate";
32 private QtView m_view;
33 private QtNative.ApplicationStateDetails m_stateDetails;
34 private boolean m_windowLoaded =
false;
35 private boolean m_backendsRegistered =
false;
37 public QtEmbeddedDelegate(Activity
context) {
40 m_stateDetails = QtNative.getStateDetails();
41 QtNative.registerAppStateListener(
this);
43 m_activity.getApplication().registerActivityLifecycleCallbacks(
44 new Application.ActivityLifecycleCallbacks() {
46 public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
49 public void onActivityStarted(Activity activity) {}
52 public void onActivityResumed(Activity activity) {
53 if (m_activity == activity && m_stateDetails.isStarted) {
54 QtNative.setApplicationState(ApplicationActive);
55 QtNative.updateWindow();
60 public void onActivityPaused(Activity activity) {
61 if (m_activity == activity && m_stateDetails.isStarted) {
62 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N ||
64 QtNative.setApplicationState(ApplicationInactive);
70 public void onActivityStopped(Activity activity) {
71 if (m_activity == activity && m_stateDetails.isStarted) {
72 QtNative.setApplicationState(ApplicationSuspended);
77 public void onActivitySaveInstanceState(Activity activity,
Bundle outState) {}
80 public void onActivityDestroyed(Activity activity) {
81 if (m_activity == activity && m_stateDetails.isStarted) {
82 m_activity.getApplication().unregisterActivityLifecycleCallbacks(
this);
83 QtNative.unregisterAppStateListener(QtEmbeddedDelegate.this);
84 QtEmbeddedViewInterfaceFactory.remove(m_activity);
85 QtNative.terminateQt();
86 QtNative.setActivity(
null);
87 QtNative.getQtThread().exit();
94 public void onAppStateDetailsChanged(QtNative.ApplicationStateDetails details) {
96 m_stateDetails = details;
97 if (details.isStarted && !m_backendsRegistered) {
98 m_backendsRegistered =
true;
99 BackendRegister.registerBackend(QtWindowInterface.class, (QtWindowInterface)
this);
100 BackendRegister.registerBackend(QtMenuInterface.class, (QtMenuInterface)
this);
101 BackendRegister.registerBackend(QtLayoutInterface.class, (QtLayoutInterface)
this);
102 }
else if (!details.isStarted && m_backendsRegistered) {
103 m_backendsRegistered =
false;
104 BackendRegister.unregisterBackend(QtWindowInterface.class);
105 BackendRegister.unregisterBackend(QtMenuInterface.class);
106 BackendRegister.unregisterBackend(QtLayoutInterface.class);
112 public void onNativePluginIntegrationReadyChanged(
boolean ready)
114 synchronized (
this) {
116 QtNative.runAction(() -> {
117 DisplayMetrics
metrics = Resources.getSystem().getDisplayMetrics();
118 QtDisplayManager.setApplicationDisplayMetrics(m_activity,
metrics.widthPixels,
128 void startNativeApplicationImpl(String appParams, String mainLib)
130 QtNative.startApplication(appParams, mainLib);
134 public QtLayout getQtLayout()
141 return m_view.getQtWindow();
148 super.startNativeApplication(appParams, mainLib);
152 public void queueLoadWindow()
154 synchronized (
this) {
155 if (m_stateDetails.nativePluginIntegrationReady)
161 public void setView(QtView
view)
164 updateInputDelegate();
166 registerGlobalFocusChangeListener(m_view);
170 private void updateInputDelegate() {
171 if (m_view ==
null) {
172 m_inputDelegate.setEditPopupMenu(
null);
175 m_inputDelegate.setEditPopupMenu(
new EditPopupMenu(m_activity, m_view));
179 if (m_view !=
null && !m_windowLoaded) {
180 QtView.createRootWindow(m_view, m_view.getLeft(), m_view.getTop(), m_view.getWidth(),
182 m_windowLoaded =
true;
188 public void resetOptionsMenu() { QtNative.runAction(() -> m_activity.invalidateOptionsMenu()); }
191 public void openOptionsMenu() { QtNative.runAction(() -> m_activity.openOptionsMenu()); }
194 public void closeContextMenu() { QtNative.runAction(() -> m_activity.closeContextMenu()); }
197 public void openContextMenu(
final int x,
final int y,
final int w,
final int h)
199 QtLayout
layout = getQtLayout();
200 layout.postDelayed(() -> {
201 final QtEditText focusedEditText = m_inputDelegate.getCurrentQtEditText();
202 if (focusedEditText ==
null) {
203 Log.w(QtTAG,
"No focused view when trying to open context menu");
206 layout.setLayoutParams(focusedEditText,
new QtLayout.LayoutParams(
w,
h,
x,
y),
false);
207 PopupMenu popup =
new PopupMenu(m_activity, focusedEditText);
208 QtNative.fillContextMenu(popup.getMenu());
209 popup.setOnMenuItemClickListener(menuItem ->
210 m_activity.onContextItemSelected(menuItem));
211 popup.setOnDismissListener(popupMenu ->
212 m_activity.onContextMenuClosed(popupMenu.getMenu()));
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)
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLfloat GLfloat GLfloat GLfloat h