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 setTheme(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ?
106 android.R.style.Theme_DeviceDefault_DayNight :
107 android.R.style.Theme_Holo_Light);
110 if (
QtNative.getStateDetails().isStarted) {
114 restartApplication();
117 QtNative.registerAppStateListener(m_delegate);
118 addReferrer(getIntent());
121 QtActivityLoader loader = QtActivityLoader.getActivityLoader(
this);
122 loader.appendApplicationParameters(m_applicationParams);
125 if (
result == QtLoader.LoadingResult.Succeeded) {
126 m_delegate.startNativeApplication(loader.getApplicationParameters(),
127 loader.getMainLibraryPath());
128 }
else if (
result == QtLoader.LoadingResult.Failed) {
129 showFatalFinishingToast();
132 }
catch (IllegalArgumentException e) {
134 showFatalFinishingToast();
138 m_prevConfig =
new Configuration(
getResources().getConfiguration());
139 m_onCreateSucceeded =
true;
142 private void showFatalFinishingToast() {
144 String packageName = getPackageName();
145 @SuppressLint(
"DiscouragedApi") int
id = resources.getIdentifier(
146 "fatal_error_msg",
"string", packageName);
157 if (Build.VERSION.SDK_INT < 24 || !isInMultiWindowMode())
159 m_delegate.displayManager().unregisterDisplayListener();
167 if (
QtNative.getStateDetails().isStarted) {
168 m_delegate.displayManager().registerDisplayListener();
169 QtWindow.updateWindows();
171 m_delegate.displayManager().reinstateFullScreen();
187 if (!m_onCreateSucceeded)
190 if (!m_retainNonConfigurationInstance) {
191 QtNative.unregisterAppStateListener(m_delegate);
192 QtNative.terminateQtNativeApplication();
201 super.onConfigurationChanged(newConfig);
203 int diff = newConfig.diff(m_prevConfig);
204 if ((diff & ActivityInfo.CONFIG_UI_MODE) != 0)
205 m_delegate.handleUiModeChange();
207 if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
210 m_prevConfig =
new Configuration(newConfig);
216 m_delegate.setContextMenuVisible(
false);
223 if (!m_delegate.isContextMenuVisible())
225 m_delegate.setContextMenuVisible(
false);
234 m_delegate.setContextMenuVisible(
true);
240 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(
event);
244 return super.dispatchKeyEvent(
event);
250 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(
event);
251 if (
QtNative.getStateDetails().isStarted && handled)
254 return super.dispatchGenericMotionEvent(
event);
260 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
261 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
264 return m_delegate.getInputDelegate().onKeyDown(keyCode,
event);
270 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
271 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
274 return m_delegate.getInputDelegate().onKeyUp(keyCode,
event);
288 m_delegate.setActionBarVisibility(
res &&
menu.size() > 0);
307 super.onRestoreInstanceState(savedInstanceState);
310 if (getLastNonConfigurationInstance() ==
null)
313 QtNative.setStarted(savedInstanceState.getBoolean(
"Started"));
314 boolean isFullScreen = savedInstanceState.getBoolean(
"isFullScreen");
315 boolean expandedToCutout = savedInstanceState.getBoolean(
"expandedToCutout");
316 m_delegate.displayManager().setSystemUiVisibility(isFullScreen, expandedToCutout);
323 super.onRetainNonConfigurationInstance();
324 m_retainNonConfigurationInstance =
true;
331 super.onSaveInstanceState(outState);
332 outState.putBoolean(
"isFullScreen", m_delegate.displayManager().isFullScreen());
333 outState.putBoolean(
"expandedToCutout", m_delegate.displayManager().expandedToCutout());
334 outState.putBoolean(
"Started",
QtNative.getStateDetails().isStarted);
340 super.onWindowFocusChanged(hasFocus);
342 m_delegate.displayManager().reinstateFullScreen();
355 super.onActivityResult(requestCode, resultCode,
data);
356 QtNative.onActivityResult(requestCode, resultCode,
data);
362 QtNative.sendRequestPermissionsResult(requestCode, grantResults);
368 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]