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
QtActivityDelegateBase.java
Go to the documentation of this file.
1// Copyright (C) 2017 BogDan Vatra <bogdan@kde.org>
2// Copyright (C) 2023 The Qt Company Ltd.
3// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6package org.qtproject.qt.android;
7
8import android.app.Activity;
9import android.content.pm.ActivityInfo;
10import android.content.pm.PackageManager;
11import android.content.res.Configuration;
12import android.graphics.Color;
13import android.graphics.drawable.ColorDrawable;
14import android.graphics.drawable.Drawable;
15import android.graphics.Rect;
16import android.os.Build;
17import android.util.DisplayMetrics;
18import android.util.Log;
19import android.util.TypedValue;
20import android.view.Display;
21import android.view.ViewTreeObserver;
22import android.view.animation.AccelerateInterpolator;
23import android.view.animation.AlphaAnimation;
24import android.view.animation.Animation;
25import android.view.Menu;
26import android.view.View;
27import android.view.ViewConfiguration;
28import android.view.ViewGroup;
29import android.view.Window;
30import android.view.WindowInsetsController;
31import android.widget.ImageView;
32import android.widget.PopupMenu;
33
34import java.util.HashMap;
35
36abstract class QtActivityDelegateBase
37{
38 protected Activity m_activity;
39 protected HashMap<Integer, QtWindow> m_topLevelWindows;
40 protected QtAccessibilityDelegate m_accessibilityDelegate = null;
41 protected QtDisplayManager m_displayManager = null;
42 protected QtInputDelegate m_inputDelegate = null;
43
44 private boolean m_membersInitialized = false;
45 private boolean m_contextMenuVisible = false;
46
47 // Subclass must implement these
48 abstract void startNativeApplicationImpl(String appParams, String mainLib);
49 abstract QtAccessibilityDelegate createAccessibilityDelegate();
50 abstract QtLayout getQtLayout();
51
52 // With these we are okay with default implementation doing nothing
53 void setUpLayout() {}
54 void setUpSplashScreen(int orientation) {}
55 void hideSplashScreen(final int duration) {}
56 void openContextMenu(final int x, final int y, final int w, final int h) {}
57 void setActionBarVisibility(boolean visible) {}
58 void addTopLevelWindow(final QtWindow window) {}
59 void removeTopLevelWindow(final int id) {}
60 void bringChildToFront(final int id) {}
61 void bringChildToBack(int id) {}
62 void setSystemUiVisibility(int systemUiVisibility) {}
63
64 QtActivityDelegateBase(Activity activity)
65 {
66 m_activity = activity;
67 // Set native context
68 QtNative.setActivity(m_activity);
69 }
70
71 QtDisplayManager displayManager() {
72 return m_displayManager;
73 }
74
75 @UsedFromNativeCode
76 QtInputDelegate getInputDelegate() {
77 return m_inputDelegate;
78 }
79
80 void setContextMenuVisible(boolean contextMenuVisible)
81 {
82 m_contextMenuVisible = contextMenuVisible;
83 }
84
85 boolean isContextMenuVisible()
86 {
87 return m_contextMenuVisible;
88 }
89
90 public boolean updateActivityAfterRestart(Activity activity) {
91 try {
92 // set new activity
93 m_activity = activity;
94 QtNative.setActivity(m_activity);
95
96 // force c++ native activity object to update
97 return QtNative.updateNativeActivity();
98 } catch (Exception e) {
99 Log.w(QtNative.QtTAG, "Failed to update the activity.");
100 e.printStackTrace();
101 return false;
102 }
103 }
104
105 public void startNativeApplication(String appParams, String mainLib)
106 {
107 if (m_membersInitialized)
108 return;
109 initMembers();
110 startNativeApplicationImpl(appParams, mainLib);
111 }
112
113 void initMembers()
114 {
115 m_membersInitialized = true;
116 m_topLevelWindows = new HashMap<Integer, QtWindow>();
117
118 m_displayManager = new QtDisplayManager(m_activity);
119 m_displayManager.registerDisplayListener();
120
121 QtInputDelegate.KeyboardVisibilityListener keyboardVisibilityListener =
122 () -> m_displayManager.updateFullScreen();
123 m_inputDelegate = new QtInputDelegate(m_activity, keyboardVisibilityListener);
124
125 try {
126 PackageManager pm = m_activity.getPackageManager();
127 ActivityInfo activityInfo = pm.getActivityInfo(m_activity.getComponentName(), 0);
128 m_inputDelegate.setSoftInputMode(activityInfo.softInputMode);
129 } catch (PackageManager.NameNotFoundException e) {
130 e.printStackTrace();
131 }
132
133 setUpLayout();
134 }
135
136 protected void registerGlobalFocusChangeListener(final View view) {
137 view.getViewTreeObserver().addOnGlobalFocusChangeListener(this::onGlobalFocusChanged);
138 }
139
140 private void onGlobalFocusChanged(View oldFocus, View newFocus) {
141 if (newFocus instanceof QtEditText) {
142 final QtWindow newWindow = (QtWindow) newFocus.getParent();
143 QtWindow.windowFocusChanged(true, newWindow.getId());
144 m_inputDelegate.setFocusedView((QtEditText) newFocus);
145 } else {
146 int id = -1;
147 if (oldFocus instanceof QtEditText) {
148 final QtWindow oldWindow = (QtWindow) oldFocus.getParent();
149 id = oldWindow.getId();
150 }
151 QtWindow.windowFocusChanged(false, id);
152 m_inputDelegate.setFocusedView(null);
153 }
154 }
155
156 public void hideSplashScreen()
157 {
158 hideSplashScreen(0);
159 }
160
161 @UsedFromNativeCode
162 public void notifyLocationChange(int viewId)
163 {
164 if (m_accessibilityDelegate == null)
165 return;
166 m_accessibilityDelegate.notifyLocationChange(viewId);
167 }
168
169 @UsedFromNativeCode
170 public void notifyObjectHide(int viewId, int parentId)
171 {
172 if (m_accessibilityDelegate == null)
173 return;
174 m_accessibilityDelegate.notifyObjectHide(viewId, parentId);
175 }
176
177 @UsedFromNativeCode
178 public void notifyObjectShow(int parentId)
179 {
180 if (m_accessibilityDelegate == null)
181 return;
182 m_accessibilityDelegate.notifyObjectShow(parentId);
183 }
184
185 @UsedFromNativeCode
186 public void notifyObjectFocus(int viewId)
187 {
188 if (m_accessibilityDelegate == null)
189 return;
190 m_accessibilityDelegate.notifyObjectFocus(viewId);
191 }
192
193 @UsedFromNativeCode
194 public void notifyValueChanged(int viewId, String value)
195 {
196 if (m_accessibilityDelegate == null)
197 return;
198 m_accessibilityDelegate.notifyValueChanged(viewId, value);
199 }
200
201 @UsedFromNativeCode
202 public void notifyScrolledEvent(int viewId)
203 {
204 if (m_accessibilityDelegate == null)
205 return;
206 m_accessibilityDelegate.notifyScrolledEvent(viewId);
207 }
208
209 @UsedFromNativeCode
210 public void initializeAccessibility()
211 {
212 QtNative.runAction(() -> {
213 m_accessibilityDelegate = createAccessibilityDelegate();
214 });
215 }
216
217 void handleUiModeChange(int uiMode)
218 {
219 // QTBUG-108365
220 if (Build.VERSION.SDK_INT >= 30) {
221 // Since 29 version we are using Theme_DeviceDefault_DayNight
222 Window window = m_activity.getWindow();
223 WindowInsetsController controller = window.getInsetsController();
224 if (controller != null) {
225 // set APPEARANCE_LIGHT_STATUS_BARS if needed
226 int appearanceLight = Color.luminance(window.getStatusBarColor()) > 0.5 ?
227 WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS : 0;
228 controller.setSystemBarsAppearance(appearanceLight,
229 WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
230 }
231 }
232 switch (uiMode) {
233 case Configuration.UI_MODE_NIGHT_NO:
234 ExtractStyle.runIfNeeded(m_activity, false);
235 QtDisplayManager.handleUiDarkModeChanged(0);
236 break;
237 case Configuration.UI_MODE_NIGHT_YES:
238 ExtractStyle.runIfNeeded(m_activity, true);
239 QtDisplayManager.handleUiDarkModeChanged(1);
240 break;
241 }
242 }
243
244 @UsedFromNativeCode
245 public void resetOptionsMenu()
246 {
247 QtNative.runAction(() -> m_activity.invalidateOptionsMenu());
248 }
249
250 @UsedFromNativeCode
251 public void openOptionsMenu()
252 {
253 QtNative.runAction(() -> m_activity.openOptionsMenu());
254 }
255
256 public void onCreatePopupMenu(Menu menu)
257 {
258 QtNative.fillContextMenu(menu);
259 m_contextMenuVisible = true;
260 }
261
262 @UsedFromNativeCode
263 public void closeContextMenu()
264 {
265 QtNative.runAction(() -> m_activity.closeContextMenu());
266 }
267}
[Window class with invokable method]
Definition window.h:11
Q_CORE_EXPORT QtJniTypes::Activity activity()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint y
GLfloat GLfloat GLfloat GLfloat h
aWidget window() -> setWindowTitle("New Window Title")
[2]
QMenu menu
[5]
QQuickView * view
[0]