4package org.qtproject.qt.android;
6import android.annotation.SuppressLint;
7import android.app.Activity;
8import android.app.AlertDialog;
9import android.app.Dialog;
10import android.content.Intent;
11import android.content.pm.ActivityInfo;
12import android.content.res.Configuration;
13import android.content.res.Resources;
14import android.net.Uri;
15import android.os.Build;
16import android.os.Bundle;
17import android.provider.Browser;
18import android.view.ContextMenu;
19import android.view.ContextMenu.ContextMenuInfo;
20import android.view.KeyEvent;
21import android.view.Menu;
22import android.view.MenuItem;
23import android.view.MotionEvent;
24import android.view.View;
25import android.view.Window;
26import java.lang.IllegalArgumentException;
28import android.widget.Toast;
34 private String m_applicationParams =
"";
35 private boolean m_isCustomThemeSet =
false;
36 private boolean m_retainNonConfigurationInstance =
false;
37 private Configuration m_prevConfig;
38 private final QtActivityDelegate m_delegate;
39 private boolean m_onCreateSucceeded =
false;
41 private void addReferrer(Intent intent)
48 Uri referrer = getReferrer();
49 if (referrer !=
null) {
50 String cleanReferrer = referrer.toString().replaceFirst(
"android-app://",
"");
54 String applicationId =
extras.getString(Browser.EXTRA_APPLICATION_ID);
55 if (applicationId !=
null)
67 @SuppressWarnings(
"unused")
73 if (!m_applicationParams.isEmpty())
74 m_applicationParams +=
" ";
75 m_applicationParams +=
params;
80 super.setTheme(resId);
81 m_isCustomThemeSet =
true;
84 private void restartApplication() {
85 Intent intent = Intent.makeRestartActivityTask(getComponentName());
86 startActivity(intent);
90 Runtime.getRuntime().exit(0);
95 m_delegate =
new QtActivityDelegate(
this);
101 super.onCreate(savedInstanceState);
102 requestWindowFeature(
Window.FEATURE_ACTION_BAR);
104 if (!m_isCustomThemeSet) {
105 @SuppressWarnings(
"deprecation")
106 int themeId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
107 ? android.R.style.Theme_DeviceDefault_DayNight
108 :
android.R.style.Theme_Holo_Light;
112 if (
QtNative.getStateDetails().isStarted) {
116 restartApplication();
119 QtNative.registerAppStateListener(m_delegate);
120 addReferrer(getIntent());
123 QtActivityLoader loader = QtActivityLoader.getActivityLoader(
this);
124 loader.appendApplicationParameters(m_applicationParams);
127 if (
result == QtLoader.LoadingResult.Succeeded) {
128 m_delegate.startNativeApplication(loader.getApplicationParameters(),
129 loader.getMainLibraryPath());
130 }
else if (
result == QtLoader.LoadingResult.Failed) {
131 showFatalFinishingToast();
134 }
catch (IllegalArgumentException e) {
136 showFatalFinishingToast();
140 m_prevConfig =
new Configuration(
getResources().getConfiguration());
141 m_onCreateSucceeded =
true;
144 private void showFatalFinishingToast() {
146 String packageName = getPackageName();
147 @SuppressLint(
"DiscouragedApi") int
id = resources.getIdentifier(
148 "fatal_error_msg",
"string", packageName);
159 if (Build.VERSION.SDK_INT < 24 || !isInMultiWindowMode())
161 m_delegate.displayManager().unregisterDisplayListener();
169 if (
QtNative.getStateDetails().isStarted) {
170 m_delegate.displayManager().registerDisplayListener();
171 QtWindow.updateWindows();
173 QtWindowInsetsController.restoreFullScreenVisibility(
this);
189 if (!m_onCreateSucceeded)
192 if (!m_retainNonConfigurationInstance) {
193 QtNative.unregisterAppStateListener(m_delegate);
194 QtNative.terminateQtNativeApplication();
203 super.onConfigurationChanged(newConfig);
205 int diff = newConfig.diff(m_prevConfig);
206 if ((diff & ActivityInfo.CONFIG_UI_MODE) != 0)
207 m_delegate.handleUiModeChange();
209 if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
212 m_prevConfig =
new Configuration(newConfig);
218 m_delegate.setContextMenuVisible(
false);
225 if (!m_delegate.isContextMenuVisible())
227 m_delegate.setContextMenuVisible(
false);
236 m_delegate.setContextMenuVisible(
true);
242 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(
event);
246 return super.dispatchKeyEvent(
event);
252 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(
event);
253 if (
QtNative.getStateDetails().isStarted && handled)
256 return super.dispatchGenericMotionEvent(
event);
262 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
263 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
266 return m_delegate.getInputDelegate().onKeyDown(keyCode,
event);
272 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
273 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
276 return m_delegate.getInputDelegate().onKeyUp(keyCode,
event);
290 m_delegate.setActionBarVisibility(
res &&
menu.size() > 0);
309 super.onRestoreInstanceState(savedInstanceState);
312 if (getLastNonConfigurationInstance() ==
null)
315 QtNative.setStarted(savedInstanceState.getBoolean(
"Started"));
316 QtWindowInsetsController.restoreFullScreenVisibility(
this);
323 super.onRetainNonConfigurationInstance();
324 m_retainNonConfigurationInstance =
true;
331 super.onSaveInstanceState(outState);
332 outState.putBoolean(
"Started",
QtNative.getStateDetails().isStarted);
338 super.onWindowFocusChanged(hasFocus);
340 QtWindowInsetsController.restoreFullScreenVisibility(
this);
353 super.onActivityResult(requestCode, resultCode,
data);
354 QtNative.onActivityResult(requestCode, resultCode,
data);
360 QtNative.sendRequestPermissionsResult(requestCode, grantResults);
366 m_delegate.hideSplashScreen(duration);
[Window class with invokable method]
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
boolean onPrepareOptionsMenu(Menu menu)
static final String EXTRA_SOURCE_INFO
boolean onOptionsItemSelected(MenuItem item)
boolean dispatchGenericMotionEvent(MotionEvent event)
void appendApplicationParameters(String params)
void onSaveInstanceState(Bundle outState)
boolean onKeyDown(int keyCode, KeyEvent event)
void onNewIntent(Intent intent)
void hideSplashScreen(final int duration)
void onCreate(Bundle savedInstanceState)
boolean dispatchKeyEvent(KeyEvent event)
void onActivityResult(int requestCode, int resultCode, Intent data)
boolean onContextItemSelected(MenuItem item)
void onWindowFocusChanged(boolean hasFocus)
void onConfigurationChanged(Configuration newConfig)
boolean onKeyUp(int keyCode, KeyEvent event)
void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
void onOptionsMenuClosed(Menu menu)
Object onRetainNonConfigurationInstance()
void onRestoreInstanceState(Bundle savedInstanceState)
boolean onCreateOptionsMenu(Menu menu)
void onContextMenuClosed(Menu menu)
static native void onNewIntent(Intent data)
QMap< Name, StatePointer > Bundle
[vector_of_multirole_objects_0]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]
GLuint GLsizei const GLchar * message
GLsizei const GLfloat * v
static QStringList getResources(const QString &resourceFile, QMakeVfs *vfs)
static QString getString(IMFActivate *device, const IID &id)
void handleResult(const QFuture< T > &future)
if(foo.startsWith("("+type+") 0x")) ... QString hello("hello")
[0]