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();
187 m_delegate.getInputDelegate().unregisterBackGestureCallback(
this);
195 if (
QtNative.getStateDetails().isStarted) {
196 m_delegate.displayManager().registerDisplayListener();
197 QtWindow.updateWindows();
199 QtWindowInsetsController.restoreFullScreenVisibility(
this);
201 m_delegate.getInputDelegate().registerBackGestureCallback(
this);
216 if (!m_onCreateSucceeded)
219 if (!m_retainNonConfigurationInstance) {
220 QtNative.unregisterAppStateListener(m_delegate);
221 QtNative.terminateQtNativeApplication();
230 super.onConfigurationChanged(newConfig);
232 int diff = newConfig.diff(m_prevConfig);
233 if ((diff & ActivityInfo.CONFIG_UI_MODE) != 0)
234 m_delegate.handleUiModeChange();
236 if ((diff & ActivityInfo.CONFIG_LOCALE) != 0)
239 m_prevConfig =
new Configuration(newConfig);
245 m_delegate.setContextMenuVisible(
false);
246 return QtNative.onContextItemSelected(item.getItemId(), item.isChecked());
252 if (!m_delegate.isContextMenuVisible())
254 m_delegate.setContextMenuVisible(
false);
263 m_delegate.setContextMenuVisible(
true);
269 boolean handleResult = m_delegate.getInputDelegate().handleDispatchKeyEvent(
event);
273 return super.dispatchKeyEvent(
event);
279 boolean handled = m_delegate.getInputDelegate().handleDispatchGenericMotionEvent(
event);
280 if (
QtNative.getStateDetails().isStarted && handled)
283 return super.dispatchGenericMotionEvent(
event);
289 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
290 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
293 return m_delegate.getInputDelegate().onKeyDown(keyCode,
event);
299 QtNative.ApplicationStateDetails stateDetails =
QtNative.getStateDetails();
300 if (!stateDetails.isStarted || !stateDetails.nativePluginIntegrationReady)
303 return m_delegate.getInputDelegate().onKeyUp(keyCode,
event);
317 m_delegate.setActionBarVisibility(
res &&
menu.size() > 0);
324 return QtNative.onOptionsItemSelected(item.getItemId(), item.isChecked());
336 super.onRestoreInstanceState(savedInstanceState);
339 if (getLastNonConfigurationInstance() ==
null)
342 QtNative.setStarted(savedInstanceState.getBoolean(
"Started"));
343 QtWindowInsetsController.restoreFullScreenVisibility(
this);
350 super.onRetainNonConfigurationInstance();
351 m_retainNonConfigurationInstance =
true;
358 super.onSaveInstanceState(outState);
359 outState.putBoolean(
"Started",
QtNative.getStateDetails().isStarted);
365 super.onWindowFocusChanged(hasFocus);
367 QtWindowInsetsController.restoreFullScreenVisibility(
this);
380 super.onActivityResult(requestCode, resultCode,
data);
381 QtNative.onActivityResult(requestCode, resultCode,
data);
387 QtNative.sendRequestPermissionsResult(requestCode, grantResults);
393 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]