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
QtActivityBase.java
Go to the documentation of this file.
1// Copyright (C) 2023 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 android.app.Activity;
7import android.content.Intent;
8import android.content.res.Configuration;
9import android.net.Uri;
10import android.os.Build;
11import android.os.Bundle;
12import android.provider.Browser;
13import android.view.ContextMenu;
14import android.view.ContextMenu.ContextMenuInfo;
15import android.view.KeyEvent;
16import android.view.Menu;
17import android.view.MenuItem;
18import android.view.MotionEvent;
19import android.view.View;
20import android.view.Window;
21
22public class QtActivityBase extends Activity implements QtNative.AppStateDetailsListener
23{
24 private String m_applicationParams = "";
25 private boolean m_isCustomThemeSet = false;
26 private boolean m_retainNonConfigurationInstance = false;
27
28 private QtActivityDelegate m_delegate;
29
30 public static final String EXTRA_SOURCE_INFO = "org.qtproject.qt.android.sourceInfo";
31
32 private void addReferrer(Intent intent)
33 {
34 if (intent.getExtras() != null && intent.getExtras().getString(EXTRA_SOURCE_INFO) != null)
35 return;
36
37 String browserApplicationId = "";
38 if (intent.getExtras() != null)
39 browserApplicationId = intent.getExtras().getString(Browser.EXTRA_APPLICATION_ID);
40
41 String sourceInformation = "";
42 if (browserApplicationId != null && !browserApplicationId.isEmpty()) {
43 sourceInformation = browserApplicationId;
44 } else {
45 Uri referrer = getReferrer();
46 if (referrer != null)
47 sourceInformation = referrer.toString().replaceFirst("android-app://", "");
48 }
49
50 intent.putExtra(EXTRA_SOURCE_INFO, sourceInformation);
51 }
52
53 // Append any parameters to your application.
54 // Either a whitespace or a tab is accepted as a separator between parameters.
57 {
58 if (params == null || params.isEmpty())
59 return;
60
61 if (!m_applicationParams.isEmpty())
62 m_applicationParams += " ";
63 m_applicationParams += params;
64 }
65
66 private void handleActivityRestart() {
67 if (QtNative.getStateDetails().isStarted) {
68 boolean updated = m_delegate.updateActivityAfterRestart(this);
69 if (!updated) {
70 // could not update the activity so restart the application
71 Intent intent = Intent.makeRestartActivityTask(getComponentName());
72 startActivity(intent);
73 QtNative.quitApp();
74 Runtime.getRuntime().exit(0);
75 }
76 }
77 }
78
79 @Override
80 public void setTheme(int resId) {
81 super.setTheme(resId);
82 m_isCustomThemeSet = true;
83 }
84
85 @Override
86 protected void onCreate(Bundle savedInstanceState)
87 {
88 super.onCreate(savedInstanceState);
89 requestWindowFeature(Window.FEATURE_ACTION_BAR);
90
91 if (!m_isCustomThemeSet) {
92 setTheme(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ?
93 android.R.style.Theme_DeviceDefault_DayNight :
94 android.R.style.Theme_Holo_Light);
95 }
96
97 m_delegate = new QtActivityDelegate(this);
98
99 QtNative.registerAppStateListener(this);
100
101 handleActivityRestart();
102 addReferrer(getIntent());
103
104 QtActivityLoader loader = new QtActivityLoader(this);
105 loader.appendApplicationParameters(m_applicationParams);
106
107 loader.loadQtLibraries();
108 m_delegate.startNativeApplication(loader.getApplicationParameters(),
109 loader.getMainLibraryPath());
110 }
111
112 @Override
113 public void onAppStateDetailsChanged(QtNative.ApplicationStateDetails details) {
114 if (details.isStarted)
115 m_delegate.registerBackends();
116 else
117 m_delegate.unregisterBackends();
118 }
119
120 @Override
121 protected void onStart()
122 {
123 super.onStart();
124 }
125
126 @Override
127 protected void onRestart()
128 {
129 super.onRestart();
130 }
131
132 @Override
133 protected void onPause()
134 {
135 super.onPause();
136 if (Build.VERSION.SDK_INT < 24 || !isInMultiWindowMode())
137 QtNative.setApplicationState(QtNative.ApplicationState.ApplicationInactive);
138 m_delegate.displayManager().unregisterDisplayListener();
139 }
140
141 @Override
142 protected void onResume()
143 {
144 super.onResume();
145 QtNative.setApplicationState(QtNative.ApplicationState.ApplicationActive);
146 if (QtNative.getStateDetails().isStarted) {
147 m_delegate.displayManager().registerDisplayListener();
148 QtNative.updateWindow();
149 // Suspending the app clears the immersive mode, so we need to set it again.
150 m_delegate.displayManager().updateFullScreen();
151 }
152 }
153
154 @Override
155 protected void onStop()
156 {
157 super.onStop();
158 QtNative.setApplicationState(QtNative.ApplicationState.ApplicationSuspended);
159 }
160
161 @Override
162 protected void onDestroy()
163 {
164 super.onDestroy();
165 if (!m_retainNonConfigurationInstance) {
166 QtNative.unregisterAppStateListener(this);
167 QtNative.terminateQt();
168 QtNative.setActivity(null);
169 QtNative.getQtThread().exit();
170 System.exit(0);
171 }
172 }
173
174 @Override
175 public void onConfigurationChanged(Configuration newConfig)
176 {
177 super.onConfigurationChanged(newConfig);
178 m_delegate.handleUiModeChange(newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK);
179 }
180
181 @Override
182 public boolean onContextItemSelected(MenuItem item)
183 {
184 m_delegate.setContextMenuVisible(false);
185 return QtNative.onContextItemSelected(item.getItemId(), item.isChecked());
186 }
187
188 @Override
189 public void onContextMenuClosed(Menu menu)
190 {
191 if (!m_delegate.isContextMenuVisible())
192 return;
193 m_delegate.setContextMenuVisible(false);
194 QtNative.onContextMenuClosed(menu);
195 }
196
197 @Override
198 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
199 {
200 menu.clearHeader();
201 QtNative.onCreateContextMenu(menu);
202 m_delegate.setContextMenuVisible(true);
203 }
204
205 @Override
206 public boolean dispatchKeyEvent(KeyEvent event)
207 {
208 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(event);
209 if (QtNative.getStateDetails().isStarted && handleResult)
210 return true;
211
212 return super.dispatchKeyEvent(event);
213 }
214
215 @Override
216 public boolean dispatchGenericMotionEvent(MotionEvent event)
217 {
218 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(event);
219 if (QtNative.getStateDetails().isStarted && handled)
220 return true;
221
222 return super.dispatchGenericMotionEvent(event);
223 }
224
225 @Override
226 public boolean onKeyDown(int keyCode, KeyEvent event)
227 {
228 QtNative.ApplicationStateDetails stateDetails = QtNative.getStateDetails();
229 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
230 return false;
231
232 return m_delegate.getInputDelegate().onKeyDown(keyCode, event);
233 }
234
235 @Override
236 public boolean onKeyUp(int keyCode, KeyEvent event)
237 {
238 QtNative.ApplicationStateDetails stateDetails = QtNative.getStateDetails();
239 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
240 return false;
241
242 return m_delegate.getInputDelegate().onKeyUp(keyCode, event);
243 }
244
245 @Override
246 public boolean onCreateOptionsMenu(Menu menu)
247 {
248 menu.clear();
249 return true;
250 }
251
252 @Override
253 public boolean onPrepareOptionsMenu(Menu menu)
254 {
255 boolean res = QtNative.onPrepareOptionsMenu(menu);
256 m_delegate.setActionBarVisibility(res && menu.size() > 0);
257 return res;
258 }
259
260 @Override
261 public boolean onOptionsItemSelected(MenuItem item)
262 {
263 return QtNative.onOptionsItemSelected(item.getItemId(), item.isChecked());
264 }
265
266 @Override
267 public void onOptionsMenuClosed(Menu menu)
268 {
269 QtNative.onOptionsMenuClosed(menu);
270 }
271
272 @Override
273 protected void onRestoreInstanceState(Bundle savedInstanceState)
274 {
275 super.onRestoreInstanceState(savedInstanceState);
276 QtNative.setStarted(savedInstanceState.getBoolean("Started"));
277 int savedSystemUiVisibility = savedInstanceState.getInt("SystemUiVisibility");
278 m_delegate.displayManager().setSystemUiVisibility(savedSystemUiVisibility);
279 // FIXME restore all surfaces
280 }
281
282 @Override
284 {
285 super.onRetainNonConfigurationInstance();
286 m_retainNonConfigurationInstance = true;
287 return true;
288 }
289
290 @Override
291 protected void onSaveInstanceState(Bundle outState)
292 {
293 super.onSaveInstanceState(outState);
294 outState.putInt("SystemUiVisibility", m_delegate.displayManager().systemUiVisibility());
295 outState.putBoolean("Started", QtNative.getStateDetails().isStarted);
296 }
297
298 @Override
299 public void onWindowFocusChanged(boolean hasFocus)
300 {
301 super.onWindowFocusChanged(hasFocus);
302 if (hasFocus)
303 m_delegate.displayManager().updateFullScreen();
304 }
305
306 @Override
307 protected void onNewIntent(Intent intent)
308 {
309 QtNative.onNewIntent(intent);
310 }
311
312 @Override
313 protected void onActivityResult(int requestCode, int resultCode, Intent data)
314 {
315 super.onActivityResult(requestCode, resultCode, data);
316 QtNative.onActivityResult(requestCode, resultCode, data);
317 }
318
319 @Override
320 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
321 {
322 QtNative.sendRequestPermissionsResult(requestCode, permissions, grantResults);
323 }
324
326 public void hideSplashScreen(final int duration)
327 {
328 m_delegate.hideSplashScreen(duration);
329 }
330
332 QtActivityDelegateBase getActivityDelegate()
333 {
334 return m_delegate;
335 }
336}
DarwinBluetooth::DeviceInquiryDelegate * m_delegate
Definition main.cpp:8
void clear()
Removes all the menu's actions.
Definition qmenu.cpp:2225
QSize size
the size of the widget excluding any window frame
Definition qwidget.h:113
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
boolean dispatchGenericMotionEvent(MotionEvent event)
boolean onKeyDown(int keyCode, KeyEvent event)
void onCreate(Bundle savedInstanceState)
void onActivityResult(int requestCode, int resultCode, Intent data)
void onAppStateDetailsChanged(QtNative.ApplicationStateDetails details)
void onConfigurationChanged(Configuration newConfig)
boolean onKeyUp(int keyCode, KeyEvent event)
void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
void onRestoreInstanceState(Bundle savedInstanceState)
GLsizei const GLfloat * v
[13]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
void ** params
struct _cl_event * event
GLuint res
QGraphicsItem * item
QMenu menu
[5]