5package org.qtproject.qt.android;
7import android.annotation.SuppressLint;
8import android.app.Activity;
9import android.app.AlertDialog;
10import android.app.Dialog;
11import android.content.ContextWrapper;
12import android.content.Intent;
13import android.content.pm.ApplicationInfo;
14import android.content.pm.PackageManager;
15import android.content.res.Resources;
16import android.os.Bundle;
17import android.system.Os;
18import android.util.Base64;
19import android.util.DisplayMetrics;
20import android.util.Log;
22import java.lang.reflect.InvocationTargetException;
23import java.lang.reflect.Method;
24import java.nio.charset.StandardCharsets;
26class QtActivityLoader
extends QtLoader {
27 private final Activity m_activity;
29 public QtActivityLoader(Activity activity)
31 super(
new ContextWrapper(activity));
34 extractContextMetaData();
37 private void showErrorDialog() {
38 if (m_activity ==
null) {
39 Log.w(QtTAG,
"cannot show the error dialog from a null activity object");
42 Resources resources = m_activity.getResources();
43 String packageName = m_activity.getPackageName();
44 AlertDialog errorDialog =
new AlertDialog.Builder(m_activity).create();
45 @SuppressLint(
"DiscouragedApi") int
id = resources.getIdentifier(
46 "fatal_error_msg", "
string", packageName);
47 errorDialog.setMessage(resources.
getString(
id));
48 errorDialog.setButton(Dialog.BUTTON_POSITIVE, resources.
getString(android.
R.
string.
ok),
49 (
dialog, which) -> finish());
54 protected
void finish() {
55 if (m_activity ==
null) {
56 Log.w(QtTAG,
"finish() called when activity object is null");
63 private String getDecodedUtfString(String
str)
65 byte[] decodedExtraEnvVars = Base64.decode(
str, Base64.DEFAULT);
66 return new String(decodedExtraEnvVars, StandardCharsets.UTF_8);
71 int size = m_activity.getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
72 if (size < 36 || size > 512) {
73 DisplayMetrics
metrics =
new DisplayMetrics();
74 m_activity.getWindowManager().getDefaultDisplay().getMetrics(
metrics);
75 size = metrics.densityDpi / 10 * 3;
86 private void setupStyleExtraction()
88 int displayDensity = m_activity.getResources().getDisplayMetrics().densityDpi;
89 setEnvironmentVariable(
"QT_ANDROID_THEME_DISPLAY_DPI", String.valueOf(displayDensity));
91 String extractOption = getMetaData(
"android.app.extract_android_style");
92 if (extractOption.equals(
"full"))
93 setEnvironmentVariable(
"QT_USE_ANDROID_NATIVE_STYLE", String.valueOf(1));
95 String stylePath = ExtractStyle.setup(m_activity, extractOption, displayDensity);
96 setEnvironmentVariable(
"ANDROID_STYLE_PATH", stylePath);
100 protected void extractContextMetaData()
102 super.extractContextMetaData();
104 setEnvironmentVariable(
"QT_USE_ANDROID_NATIVE_DIALOGS", String.valueOf(1));
105 setEnvironmentVariable(
"QT_ANDROID_APP_ICON_SIZE", String.valueOf(getAppIconSize()));
107 setupStyleExtraction();
109 Intent intent = m_activity.getIntent();
110 if (intent ==
null) {
111 Log.w(QtTAG,
"Null Intent from the current Activity.");
115 String intentArgs = intent.getStringExtra(
"applicationArguments");
116 if (intentArgs !=
null)
117 appendApplicationParameters(intentArgs);
119 Bundle extras = intent.getExtras();
120 if (extras ==
null) {
121 Log.w(QtTAG,
"Null extras from the Activity's intent.");
125 int flags = m_activity.getApplicationInfo().flags;
126 boolean isDebuggable = (
flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
129 if (extras.containsKey(
"extraenvvars")) {
130 String extraEnvVars = extras.getString(
"extraenvvars");
131 setEnvironmentVariables(getDecodedUtfString(extraEnvVars));
134 if (extras.containsKey(
"extraappparams")) {
135 String extraAppParams = extras.getString(
"extraappparams");
136 appendApplicationParameters(getDecodedUtfString(extraAppParams));
139 m_debuggerSleepMs = 3000;
140 if (Os.getenv(
"QT_ANDROID_DEBUGGER_MAIN_THREAD_SLEEP_MS") !=
null) {
142 m_debuggerSleepMs =
Integer.parseInt(Os.getenv(
"QT_ANDROID_DEBUGGER_MAIN_THREAD_SLEEP_MS"));
143 }
catch (NumberFormatException ignored) {
147 Log.d(QtNative.QtTAG,
"Not in debug mode! It is not allowed to use extra arguments " +
148 "in non-debug mode.");
Q_CORE_EXPORT QtJniTypes::Activity activity()
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
static QString getString(IMFActivate *device, const IID &id)
QFileDialog dialog(this)
[1]