4package org.qtproject.qt.android;
6import android.annotation.SuppressLint;
7import android.app.Activity;
8import android.content.ComponentName;
9import android.content.Intent;
10import android.content.pm.ActivityInfo;
11import android.content.res.Configuration;
12import android.content.res.Resources;
13import android.net.Uri;
14import android.os.Build;
15import android.os.Bundle;
16import android.provider.Browser;
17import android.view.ContextMenu;
18import android.view.ContextMenu.ContextMenuInfo;
19import android.view.KeyEvent;
20import android.view.Menu;
21import android.view.MenuItem;
22import android.view.MotionEvent;
23import android.view.View;
24import android.view.Window;
25import android.util.Log;
26import java.lang.IllegalArgumentException;
28import android.widget.Toast;
36 private String m_applicationParams =
"";
37 private boolean m_isCustomThemeSet =
false;
38 private boolean m_retainNonConfigurationInstance =
false;
39 private Configuration m_prevConfig;
40 private final QtActivityDelegate m_delegate;
41 private boolean m_onCreateSucceeded =
false;
43 private void addReferrer(Intent intent)
50 Uri referrer = getReferrer();
51 if (referrer !=
null) {
52 String cleanReferrer = referrer.toString().replaceFirst(
"android-app://",
"");
56 String applicationId =
extras.getString(Browser.EXTRA_APPLICATION_ID);
57 if (applicationId !=
null)
69 @SuppressWarnings(
"unused")
75 if (!m_applicationParams.isEmpty())
76 m_applicationParams +=
" ";
77 m_applicationParams +=
params;
82 super.setTheme(resId);
83 m_isCustomThemeSet =
true;
86 private void restartApplication() {
87 Intent intent = Intent.makeRestartActivityTask(getComponentName());
88 startActivity(intent);
92 Runtime.getRuntime().exit(0);
97 m_delegate =
new QtActivityDelegate(
this);
103 super.onCreate(savedInstanceState);
104 requestWindowFeature(
Window.FEATURE_ACTION_BAR);
106 if (!m_isCustomThemeSet) {
107 @SuppressWarnings(
"deprecation")
108 int themeId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
109 ? android.R.style.Theme_DeviceDefault_DayNight
110 :
android.R.style.Theme_Holo_Light;
114 if (
QtNative.getStateDetails().isStarted) {
118 restartApplication();
121 QtNative.registerAppStateListener(m_delegate);
122 addReferrer(getIntent());
125 if (isLaunchedAsAlias()) {
126 Log.d(
TAG,
"Starting an alias-activity, skipping loading of the Qt libraries.");
128 QtActivityLoader loader = QtActivityLoader.getActivityLoader(
this);
131 if (
result == QtLoader.LoadingResult.Failed) {
132 showFatalFinishingToast();
136 if (
result == QtLoader.LoadingResult.Succeeded) {
137 loader.appendApplicationParameters(m_applicationParams);
138 final String params = loader.getApplicationParameters();
139 m_delegate.startNativeApplication(
params, loader.getMainLibraryPath());
142 }
catch (IllegalArgumentException e) {
144 showFatalFinishingToast();
148 m_prevConfig =
new Configuration(
getResources().getConfiguration());
149 m_onCreateSucceeded =
true;
152 private void showFatalFinishingToast() {
154 String packageName = getPackageName();
157 @SuppressLint(
"DiscouragedApi")
158 int
id = resources.getIdentifier(
"fatal_error_msg",
"string", packageName);
161 } catch (Resources.NotFoundException ignored) { }
162 Intent fatalIntent =
new Intent();
165 setResult(Activity.RESULT_CANCELED, fatalIntent);
169 private boolean isLaunchedAsAlias() {
170 final Intent intent = getIntent();
174 final ComponentName
component = intent.getComponent();
179 final String runtimeClassName = this.getClass().getName();
181 return !launchedClassName.equals(runtimeClassName);
188 if (Build.VERSION.SDK_INT < 24 || !isInMultiWindowMode())
190 m_delegate.displayManager().unregisterDisplayListener();
191 m_delegate.getInputDelegate().unregisterBackGestureCallback(
this);
199 if (
QtNative.getStateDetails().isStarted) {
200 m_delegate.displayManager().registerDisplayListener();
201 QtWindow.updateWindows();
203 QtWindowInsetsController.restoreFullScreenVisibility(
this);
205 m_delegate.getInputDelegate().registerBackGestureCallback(
this);
220 if (!m_onCreateSucceeded)
223 if (!m_retainNonConfigurationInstance) {
224 QtNative.unregisterAppStateListener(m_delegate);
225 QtNative.terminateQtNativeApplication();
234 super.onConfigurationChanged(newConfig);
236 int diff = newConfig.diff(m_prevConfig);
237 if ((diff & ActivityInfo.CONFIG_UI_MODE) != 0)
238 m_delegate.handleUiModeChange();
240 if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
243 m_prevConfig =
new Configuration(newConfig);
249 m_delegate.setContextMenuVisible(
false);
250 return QtNative.onContextItemSelected(item.getItemId(), item.isChecked());
256 if (!m_delegate.isContextMenuVisible())
258 m_delegate.setContextMenuVisible(
false);
267 m_delegate.setContextMenuVisible(
true);
273 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(
event);
277 return super.dispatchKeyEvent(
event);
283 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(
event);
284 if (
QtNative.getStateDetails().isStarted && handled)
287 return super.dispatchGenericMotionEvent(
event);
293 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
294 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
297 return m_delegate.getInputDelegate().onKeyDown(keyCode,
event);
303 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
304 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
307 return m_delegate.getInputDelegate().onKeyUp(keyCode,
event);
321 m_delegate.setActionBarVisibility(
res &&
menu.size() > 0);
328 return QtNative.onOptionsItemSelected(item.getItemId(), item.isChecked());
340 super.onRestoreInstanceState(savedInstanceState);
343 if (getLastNonConfigurationInstance() ==
null)
346 QtNative.setStarted(savedInstanceState.getBoolean(
"Started"));
347 QtWindowInsetsController.restoreFullScreenVisibility(
this);
354 super.onRetainNonConfigurationInstance();
355 m_retainNonConfigurationInstance =
true;
362 super.onSaveInstanceState(outState);
363 outState.putBoolean(
"Started",
QtNative.getStateDetails().isStarted);
369 super.onWindowFocusChanged(hasFocus);
371 QtWindowInsetsController.restoreFullScreenVisibility(
this);
384 super.onActivityResult(requestCode, resultCode,
data);
385 QtNative.onActivityResult(requestCode, resultCode,
data);
391 QtNative.sendRequestPermissionsResult(requestCode, grantResults);
397 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)
static final String EXTRA_FATAL_MESSAGE
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]
static QStringList getResources(const QString &resourceFile, QMakeVfs *vfs)
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]
GLsizei const GLfloat * v
static qreal component(const QPointF &point, unsigned int i)
static QString getString(IMFActivate *device, const IID &id)
void handleResult(const QFuture< T > &future)
if(foo.startsWith("("+type+") 0x")) ... QString hello("hello")
[0]