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 ComponentName
component = getIntent().getComponent();
175 final String runtimeClassName = this.getClass().getName();
177 return !launchedClassName.equals(runtimeClassName);
184 if (Build.VERSION.SDK_INT < 24 || !isInMultiWindowMode())
186 m_delegate.displayManager().unregisterDisplayListener();
194 if (
QtNative.getStateDetails().isStarted) {
195 m_delegate.displayManager().registerDisplayListener();
196 QtWindow.updateWindows();
198 QtWindowInsetsController.restoreFullScreenVisibility(
this);
214 if (!m_onCreateSucceeded)
217 if (!m_retainNonConfigurationInstance) {
218 QtNative.unregisterAppStateListener(m_delegate);
219 QtNative.terminateQtNativeApplication();
228 super.onConfigurationChanged(newConfig);
230 int diff = newConfig.diff(m_prevConfig);
231 if ((diff & ActivityInfo.CONFIG_UI_MODE) != 0)
232 m_delegate.handleUiModeChange();
234 if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
237 m_prevConfig =
new Configuration(newConfig);
243 m_delegate.setContextMenuVisible(
false);
244 return QtNative.onContextItemSelected(item.getItemId(), item.isChecked());
250 if (!m_delegate.isContextMenuVisible())
252 m_delegate.setContextMenuVisible(
false);
261 m_delegate.setContextMenuVisible(
true);
267 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(
event);
271 return super.dispatchKeyEvent(
event);
277 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(
event);
278 if (
QtNative.getStateDetails().isStarted && handled)
281 return super.dispatchGenericMotionEvent(
event);
287 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
288 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
291 return m_delegate.getInputDelegate().onKeyDown(keyCode,
event);
297 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
298 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
301 return m_delegate.getInputDelegate().onKeyUp(keyCode,
event);
315 m_delegate.setActionBarVisibility(
res &&
menu.size() > 0);
322 return QtNative.onOptionsItemSelected(item.getItemId(), item.isChecked());
334 super.onRestoreInstanceState(savedInstanceState);
337 if (getLastNonConfigurationInstance() ==
null)
340 QtNative.setStarted(savedInstanceState.getBoolean(
"Started"));
341 QtWindowInsetsController.restoreFullScreenVisibility(
this);
348 super.onRetainNonConfigurationInstance();
349 m_retainNonConfigurationInstance =
true;
356 super.onSaveInstanceState(outState);
357 outState.putBoolean(
"Started",
QtNative.getStateDetails().isStarted);
363 super.onWindowFocusChanged(hasFocus);
365 QtWindowInsetsController.restoreFullScreenVisibility(
this);
378 super.onActivityResult(requestCode, resultCode,
data);
379 QtNative.onActivityResult(requestCode, resultCode,
data);
385 QtNative.sendRequestPermissionsResult(requestCode, grantResults);
391 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)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]
GLuint GLsizei const GLchar * message
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]