5package org.qtproject.qt.android;
8import java.io.FileDescriptor;
9import java.io.FileNotFoundException;
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Objects;
13import java.util.concurrent.Semaphore;
15import android.app.Activity;
16import android.app.Service;
17import android.content.Context;
18import android.content.ContentResolver;
19import android.content.Intent;
20import android.content.pm.PackageManager;
21import android.content.pm.ApplicationInfo;
22import android.content.UriPermission;
23import android.net.Uri;
24import android.os.Build;
25import android.os.Handler;
26import android.os.IBinder;
27import android.os.Looper;
28import android.system.Os;
29import android.content.ClipboardManager;
30import android.content.ClipData;
31import android.content.ClipDescription;
32import android.os.ParcelFileDescriptor;
33import android.util.Log;
34import android.view.ContextMenu;
35import android.view.KeyEvent;
36import android.view.Menu;
37import android.view.MotionEvent;
38import android.view.View;
39import android.view.InputDevice;
40import android.view.Display;
41import android.hardware.display.DisplayManager;
42import android.database.Cursor;
43import android.provider.DocumentsContract;
45import java.lang.reflect.Method;
46import java.security.KeyStore;
47import java.security.cert.X509Certificate;
48import java.util.Iterator;
50import javax.net.ssl.TrustManagerFactory;
51import javax.net.ssl.TrustManager;
52import javax.net.ssl.X509TrustManager;
54import android.util.Size;
55import android.util.DisplayMetrics;
56import android.view.WindowManager;
57import android.view.WindowMetrics;
58import android.graphics.Rect;
62 private static Activity m_activity =
null;
63 private static boolean m_activityPaused =
false;
64 private static Service m_service =
null;
69 public static final String
QtTAG =
"Qt JAVA";
70 private static ArrayList<Runnable> m_lostActions =
new ArrayList<Runnable>();
71 private static boolean m_started =
false;
72 private static boolean m_isKeyboardHiding =
false;
73 private static int m_displayMetricsScreenWidthPixels = 0;
74 private static int m_displayMetricsScreenHeightPixels = 0;
75 private static int m_displayMetricsAvailableLeftPixels = 0;
76 private static int m_displayMetricsAvailableTopPixels = 0;
77 private static int m_displayMetricsAvailableWidthPixels = 0;
78 private static int m_displayMetricsAvailableHeightPixels = 0;
79 private static float m_displayMetricsRefreshRate = 60;
80 private static double m_displayMetricsXDpi = .0;
81 private static double m_displayMetricsYDpi = .0;
82 private static double m_displayMetricsScaledDensity = 1.0;
83 private static double m_displayMetricsDensity = 1.0;
84 private static int m_oldx, m_oldy;
85 private static final int m_moveThreshold = 0;
86 private static ClipboardManager m_clipboardManager =
null;
87 private static Method m_checkSelfPermissionMethod =
null;
88 private static Boolean m_tabletEventSupported =
null;
89 private static boolean m_usePrimaryClip =
false;
91 private static final int KEYBOARD_HEIGHT_THRESHOLD = 100;
93 private static final String INVALID_OR_NULL_URI_ERROR_MESSAGE =
"Received invalid/null Uri";
95 private static final Runnable runPendingCppRunnablesRunnable =
new Runnable() {
104 boolean hasActivity = m_activity !=
null && m_activityDelegate !=
null;
105 boolean hasService = m_service !=
null && m_serviceDelegate !=
null;
106 return m_started && (hasActivity || hasService);
109 private static ClassLoader m_classLoader =
null;
112 return m_classLoader;
138 return m_activityDelegate;
145 return m_serviceDelegate;
151 return joinedString.split(
",");
154 private static String getCurrentMethodNameLog()
156 return new Exception().getStackTrace()[1].getMethodName() +
": ";
159 private static Uri getUriWithValidPermission(Context
context, String uri, String openMode)
163 parsedUri = Uri.parse(uri);
164 }
catch (NullPointerException
e) {
170 String scheme = parsedUri.getScheme();
173 if (scheme.compareTo(
"content") != 0)
176 List<UriPermission> permissions =
context.getContentResolver().getPersistedUriPermissions();
177 String uriStr = parsedUri.getPath();
179 for (
int i = 0;
i < permissions.size(); ++
i) {
180 Uri iterUri = permissions.get(
i).getUri();
181 boolean isRequestPermission = permissions.get(
i).isReadPermission();
183 if (!openMode.equals(
"r"))
184 isRequestPermission = permissions.get(
i).isWritePermission();
186 if (iterUri.getPath().equals(uriStr) && isRequestPermission)
194 }
catch (SecurityException
e) {
195 Log.e(
QtTAG, getCurrentMethodNameLog() +
e.toString());
202 final Uri uri = getUriWithValidPermission(
context,
url,
"r");
204 Log.e(
QtTAG, getCurrentMethodNameLog() + INVALID_OR_NULL_URI_ERROR_MESSAGE);
209 Intent intent =
new Intent(Intent.ACTION_VIEW, uri);
210 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
212 intent.setDataAndType(uri,
mime);
217 }
catch (Exception
e) {
218 Log.e(
QtTAG, getCurrentMethodNameLog() +
e.toString());
229 if (libraries ==
null)
231 for (String libName : libraries) {
233 File
f =
new File(libName);
235 System.load(libName);
237 Log.i(
QtTAG,
"Can't find '" + libName +
"'");
238 }
catch (SecurityException
e) {
239 Log.i(
QtTAG,
"Can't load '" + libName +
"'",
e);
240 }
catch (Exception
e) {
241 Log.i(
QtTAG,
"Can't load '" + libName +
"'",
e);
254 if (libraries ==
null)
257 for (String libName : libraries) {
259 String libNameTemplate =
"lib" + libName +
".so";
260 File
f =
new File(nativeLibraryDir + libNameTemplate);
262 Log.i(
QtTAG,
"Can't find '" +
f.getAbsolutePath());
264 ApplicationInfo
info =
getContext().getApplicationContext().getPackageManager()
265 .getApplicationInfo(
getContext().getPackageName(), PackageManager.GET_META_DATA);
267 if (
info.metaData.containsKey(
"android.app.system_libs_prefix"))
268 systemLibraryDir =
info.metaData.getString(
"android.app.system_libs_prefix");
269 f =
new File(systemLibraryDir + libNameTemplate);
270 }
catch (Exception
e) {
275 System.load(
f.getAbsolutePath());
277 Log.i(
QtTAG,
"Can't find '" +
f.getAbsolutePath());
278 }
catch (Exception
e) {
279 Log.i(
QtTAG,
"Can't load '" + libName +
"'",
e);
286 public static String
loadMainLibrary(
final String mainLibrary,
final String nativeLibraryDir)
288 final String[]
res =
new String[1];
294 String mainLibNameTemplate =
"lib" + mainLibrary +
".so";
295 File
f =
new File(nativeLibraryDir + mainLibNameTemplate);
298 ApplicationInfo
info =
getContext().getApplicationContext().getPackageManager()
299 .getApplicationInfo(
getContext().getPackageName(), PackageManager.GET_META_DATA);
301 if (
info.metaData.containsKey(
"android.app.system_libs_prefix"))
302 systemLibraryDir =
info.metaData.getString(
"android.app.system_libs_prefix");
303 f =
new File(systemLibraryDir + mainLibNameTemplate);
304 }
catch (Exception
e) {
311 System.load(
f.getAbsolutePath());
312 res[0] =
f.getAbsolutePath();
313 }
catch (Exception
e) {
314 Log.e(
QtTAG,
"Can't load '" + mainLibrary +
"'",
e);
324 m_activity = qtMainActivity;
325 m_activityDelegate = qtActivityDelegate;
332 m_service = qtMainService;
333 m_serviceDelegate = qtServiceDelegate;
342 m_activityPaused =
false;
343 Iterator<Runnable> itr = m_lostActions.iterator();
344 while (itr.hasNext())
345 runAction(itr.next());
346 m_lostActions.clear();
349 m_activityPaused =
true;
356 private static void runAction(Runnable action)
359 final Looper mainLooper = Looper.getMainLooper();
360 final Handler handler =
new Handler(mainLooper);
361 final boolean active = (m_activity !=
null && !m_activityPaused) || m_service !=
null;
362 if (!active || mainLooper ==
null || !handler.post(action))
363 m_lostActions.add(action);
367 private static void runPendingCppRunnablesOnAndroidThread()
370 if (m_activity !=
null) {
371 if (!m_activityPaused)
372 m_activity.runOnUiThread(runPendingCppRunnablesRunnable);
374 runAction(runPendingCppRunnablesRunnable);
376 final Looper mainLooper = Looper.getMainLooper();
377 final Thread looperThread = mainLooper.getThread();
378 if (looperThread.equals(Thread.currentThread())) {
379 runPendingCppRunnablesRunnable.run();
381 final Handler handler =
new Handler(mainLooper);
382 handler.post(runPendingCppRunnablesRunnable);
388 private static void setViewVisibility(
final View view,
final boolean visible)
390 runAction(
new Runnable() {
401 DisplayManager displayManager =
402 (DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE);
403 if (displayManager !=
null) {
404 return displayManager.getDisplay(displayId);
412 DisplayManager displayManager =
413 (DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE);
414 if (displayManager !=
null) {
415 Display[] displays = displayManager.getDisplays();
416 return Arrays.asList(displays);
418 return new ArrayList<Display>();
423 if (Build.VERSION.SDK_INT < 31) {
424 DisplayMetrics realMetrics =
new DisplayMetrics();
425 display.getRealMetrics(realMetrics);
426 return new Size(realMetrics.widthPixels, realMetrics.heightPixels);
429 Context windowsContext = displayContext.createWindowContext(
430 WindowManager.LayoutParams.TYPE_APPLICATION,
null);
431 WindowManager displayMgr =
432 (WindowManager) windowsContext.getSystemService(Context.WINDOW_SERVICE);
433 WindowMetrics windowsMetrics = displayMgr.getCurrentWindowMetrics();
434 Rect bounds = windowsMetrics.getBounds();
435 return new Size(bounds.width(), bounds.height());
441 params =
"-platform\tandroid";
443 final boolean[]
res =
new boolean[1];
448 final String qtParams = mainLib +
params;
454 m_displayMetricsScreenWidthPixels, m_displayMetricsScreenHeightPixels,
455 m_displayMetricsAvailableLeftPixels, m_displayMetricsAvailableTopPixels,
456 m_displayMetricsAvailableWidthPixels,
457 m_displayMetricsAvailableHeightPixels, m_displayMetricsXDpi,
458 m_displayMetricsYDpi, m_displayMetricsScaledDensity,
459 m_displayMetricsDensity, m_displayMetricsRefreshRate);
475 int availableLeftPixels,
int availableTopPixels,
476 int availableWidthPixels,
477 int availableHeightPixels,
double XDpi,
478 double YDpi,
double scaledDensity,
479 double density,
float refreshRate)
482 if (XDpi < android.util.DisplayMetrics.DENSITY_LOW)
483 XDpi = android.util.DisplayMetrics.DENSITY_LOW;
484 if (YDpi < android.util.DisplayMetrics.DENSITY_LOW)
485 YDpi = android.util.DisplayMetrics.DENSITY_LOW;
490 availableTopPixels, availableWidthPixels, availableHeightPixels,
491 XDpi, YDpi, scaledDensity, density, refreshRate);
493 m_displayMetricsScreenWidthPixels = screenWidthPixels;
494 m_displayMetricsScreenHeightPixels = screenHeightPixels;
495 m_displayMetricsAvailableLeftPixels = availableLeftPixels;
496 m_displayMetricsAvailableTopPixels = availableTopPixels;
497 m_displayMetricsAvailableWidthPixels = availableWidthPixels;
498 m_displayMetricsAvailableHeightPixels = availableHeightPixels;
499 m_displayMetricsXDpi = XDpi;
500 m_displayMetricsYDpi = YDpi;
501 m_displayMetricsScaledDensity = scaledDensity;
502 m_displayMetricsDensity = density;
503 m_displayMetricsRefreshRate = refreshRate;
522 runAction(
new Runnable() {
526 if (m_activity !=
null)
528 if (m_service !=
null)
529 m_service.stopSelf();
537 static private int getAction(
int index, MotionEvent
event)
539 int action =
event.getActionMasked();
540 if (action == MotionEvent.ACTION_MOVE) {
541 int hsz =
event.getHistorySize();
543 float x =
event.getX(
index);
544 float y =
event.getY(
index);
545 for (
int h = 0;
h < hsz; ++
h) {
554 if (action == MotionEvent.ACTION_DOWN
555 || action == MotionEvent.ACTION_POINTER_DOWN &&
index ==
event.getActionIndex()) {
557 }
else if (action == MotionEvent.ACTION_UP
558 || action == MotionEvent.ACTION_POINTER_UP &&
index ==
event.getActionIndex()) {
569 if (m_tabletEventSupported ==
null)
572 switch (
event.getToolType(0)) {
573 case MotionEvent.TOOL_TYPE_STYLUS:
576 case MotionEvent.TOOL_TYPE_ERASER:
581 if (
event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
583 }
else if (m_tabletEventSupported &&
pointerType != 0) {
588 for (
int i = 0;
i <
event.getPointerCount(); ++
i) {
601 switch (
event.getAction()) {
602 case MotionEvent.ACTION_DOWN:
606 case MotionEvent.ACTION_UP:
610 case MotionEvent.ACTION_CANCEL:
627 if (((
event.getAction() & (MotionEvent.ACTION_SCROLL | MotionEvent.ACTION_HOVER_MOVE)) == 0)
628 || (
event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != InputDevice.SOURCE_CLASS_POINTER) {
637 switch (
event.getActionMasked()) {
638 case MotionEvent.ACTION_UP:
642 case MotionEvent.ACTION_DOWN:
644 m_oldx = (int)
event.getX();
645 m_oldy = (int)
event.getY();
647 case MotionEvent.ACTION_HOVER_MOVE:
648 case MotionEvent.ACTION_MOVE:
649 if (
event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
652 int dx = (int) (
event.getX() - m_oldx);
653 int dy = (int) (
event.getY() - m_oldy);
654 if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
656 m_oldx = (int)
event.getX();
657 m_oldy = (int)
event.getY();
661 case MotionEvent.ACTION_SCROLL:
663 event.getAxisValue(MotionEvent.AXIS_HSCROLL),
event.getAxisValue(MotionEvent.AXIS_VSCROLL));
672 if (m_activity !=
null)
679 int perm = PackageManager.PERMISSION_DENIED;
682 PackageManager pm =
context.getPackageManager();
683 perm = pm.checkPermission(permission,
context.getPackageName());
689 private static void updateSelection(
final int selStart,
691 final int candidatesStart,
692 final int candidatesEnd)
694 runAction(
new Runnable() {
697 if (m_activityDelegate !=
null)
698 m_activityDelegate.
updateSelection(selStart, selEnd, candidatesStart, candidatesEnd);
703 private static int getSelectHandleWidth()
708 private static void updateHandles(
final int mode,
711 final int editButtons,
718 runAction(
new Runnable() {
726 private static void showSoftwareKeyboard(
final int x,
730 final int inputHints,
731 final int enterKeyType)
733 runAction(
new Runnable() {
736 if (m_activityDelegate !=
null)
742 private static void resetSoftwareKeyboard()
744 runAction(
new Runnable() {
747 if (m_activityDelegate !=
null)
753 private static void hideSoftwareKeyboard()
755 m_isKeyboardHiding =
true;
756 runAction(
new Runnable() {
759 if (m_activityDelegate !=
null)
765 private static void setSystemUiVisibility(
final int systemUiVisibility)
767 runAction(
new Runnable() {
770 if (m_activityDelegate !=
null) {
783 private static void notifyAccessibilityLocationChange(
final int viewId)
785 runAction(
new Runnable() {
788 if (m_activityDelegate !=
null) {
795 private static void notifyObjectHide(
final int viewId,
final int parentId)
797 runAction(
new Runnable() {
800 if (m_activityDelegate !=
null) {
807 private static void notifyObjectFocus(
final int viewId)
809 runAction(
new Runnable() {
812 if (m_activityDelegate !=
null) {
819 private static void notifyValueChanged(
int viewId, String
value)
821 runAction(
new Runnable() {
824 if (m_activityDelegate !=
null) {
831 private static void notifyScrolledEvent(
final int viewId)
833 runAction(
new Runnable() {
836 if (m_activityDelegate !=
null) {
848 private static void registerClipboardManager()
850 if (m_service ==
null || m_activity !=
null) {
851 final Semaphore semaphore =
new Semaphore(0);
852 runAction(
new Runnable() {
855 if (m_activity !=
null)
856 m_clipboardManager = (android.content.ClipboardManager) m_activity.getSystemService(Context.CLIPBOARD_SERVICE);
857 if (m_clipboardManager !=
null) {
858 m_clipboardManager.addPrimaryClipChangedListener(
new ClipboardManager.OnPrimaryClipChangedListener() {
859 public void onPrimaryClipChanged() {
869 }
catch (Exception
e) {
875 private static void clearClipData()
877 if (m_clipboardManager !=
null) {
878 if (Build.VERSION.SDK_INT >= 28) {
879 m_clipboardManager.clearPrimaryClip();
881 String[] mimeTypes = { ClipDescription.MIMETYPE_UNKNOWN };
883 m_clipboardManager.setPrimaryClip(
data);
886 m_usePrimaryClip =
false;
888 private static void setClipboardText(String
text)
890 if (m_clipboardManager !=
null) {
892 updatePrimaryClip(clipData);
898 return hasClipboardMimeType(
"text/plain");
901 private static String getClipboardText()
904 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
905 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
906 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
907 if (primaryClip.getItemAt(
i).getText() !=
null)
908 return primaryClip.getItemAt(
i).getText().toString();
910 }
catch (Exception
e) {
911 Log.e(
QtTAG,
"Failed to get clipboard data",
e);
916 private static void updatePrimaryClip(
ClipData clipData)
919 if (m_usePrimaryClip) {
920 ClipData clip = m_clipboardManager.getPrimaryClip();
921 if (Build.VERSION.SDK_INT >= 26) {
922 Objects.requireNonNull(clip).addItem(m_activity.getContentResolver(), clipData.getItemAt(0));
924 Objects.requireNonNull(clip).addItem(clipData.getItemAt(0));
926 m_clipboardManager.setPrimaryClip(clip);
928 m_clipboardManager.setPrimaryClip(clipData);
929 m_usePrimaryClip =
true;
931 }
catch (Exception
e) {
932 Log.e(
QtTAG,
"Failed to set clipboard data",
e);
936 private static void setClipboardHtml(String
text, String html)
938 if (m_clipboardManager !=
null) {
940 updatePrimaryClip(clipData);
944 private static boolean hasClipboardMimeType(String
mimeType)
946 if (m_clipboardManager ==
null)
949 ClipDescription description = m_clipboardManager.getPrimaryClipDescription();
951 if (description ==
null)
954 for (
int i = 0;
i < description.getMimeTypeCount(); ++
i) {
955 String itemMimeType = description.getMimeType(
i);
964 return hasClipboardMimeType(
"text/html");
967 private static String getClipboardHtml()
970 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
971 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
972 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
973 if (primaryClip.getItemAt(
i).getHtmlText() !=
null)
974 return primaryClip.getItemAt(
i).getHtmlText().toString();
976 }
catch (Exception
e) {
977 Log.e(
QtTAG,
"Failed to get clipboard data",
e);
982 private static void setClipboardUri(String uriString)
984 if (m_clipboardManager !=
null) {
985 ClipData clipData =
ClipData.newUri(m_activity.getContentResolver(),
"text/uri-list",
986 Uri.parse(uriString));
987 updatePrimaryClip(clipData);
993 return hasClipboardMimeType(
"text/uri-list");
996 private static String[] getClipboardUris()
998 ArrayList<String> uris =
new ArrayList<String>();
1000 if (m_clipboardManager !=
null && m_clipboardManager.hasPrimaryClip()) {
1001 ClipData primaryClip = m_clipboardManager.getPrimaryClip();
1002 for (
int i = 0;
i < primaryClip.getItemCount(); ++
i)
1003 if (primaryClip.getItemAt(
i).getUri() !=
null)
1004 uris.add(primaryClip.getItemAt(
i).getUri().toString());
1006 }
catch (Exception
e) {
1007 Log.e(
QtTAG,
"Failed to get clipboard data",
e);
1009 String[]
strings =
new String[uris.size()];
1014 private static void openContextMenu(
final int x,
final int y,
final int w,
final int h)
1016 runAction(
new Runnable() {
1019 if (m_activityDelegate !=
null)
1025 private static void closeContextMenu()
1027 runAction(
new Runnable() {
1030 if (m_activityDelegate !=
null)
1036 private static void resetOptionsMenu()
1038 runAction(
new Runnable() {
1041 if (m_activityDelegate !=
null)
1047 private static void openOptionsMenu()
1049 runAction(
new Runnable() {
1052 if (m_activity !=
null)
1053 m_activity.openOptionsMenu();
1058 private static byte[][] getSSLCertificates()
1060 ArrayList<byte[]> certificateList =
new ArrayList<byte[]>();
1063 TrustManagerFactory
factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
1064 factory.init((KeyStore)
null);
1067 if (
manager instanceof X509TrustManager) {
1068 X509TrustManager trustManager = (X509TrustManager)
manager;
1070 for (X509Certificate certificate : trustManager.getAcceptedIssuers()) {
1071 byte buffer[] = certificate.getEncoded();
1072 certificateList.add(
buffer);
1076 }
catch (Exception
e) {
1077 Log.e(
QtTAG,
"Failed to get certificates",
e);
1080 byte[][] certificateArray =
new byte[certificateList.size()][];
1081 certificateArray = certificateList.toArray(certificateArray);
1082 return certificateArray;
1085 private static void createSurface(
final int id,
final boolean onTop,
final int x,
final int y,
final int w,
final int h,
final int imageDepth)
1087 runAction(
new Runnable() {
1090 if (m_activityDelegate !=
null)
1096 private static void insertNativeView(
final int id,
final View view,
final int x,
final int y,
final int w,
final int h)
1098 runAction(
new Runnable() {
1101 if (m_activityDelegate !=
null)
1107 private static void setSurfaceGeometry(
final int id,
final int x,
final int y,
final int w,
final int h)
1109 runAction(
new Runnable() {
1112 if (m_activityDelegate !=
null)
1118 private static void bringChildToFront(
final int id)
1120 runAction(
new Runnable() {
1123 if (m_activityDelegate !=
null)
1129 private static void bringChildToBack(
final int id)
1131 runAction(
new Runnable() {
1134 if (m_activityDelegate !=
null)
1140 private static void destroySurface(
final int id)
1142 runAction(
new Runnable() {
1145 if (m_activityDelegate !=
null)
1151 private static void initializeAccessibility()
1153 runAction(
new Runnable() {
1161 private static void hideSplashScreen(
final int duration)
1163 runAction(
new Runnable() {
1166 if (m_activityDelegate !=
null)
1174 m_isKeyboardHiding =
false;
1178 private static String[] listAssetContent(android.content.res.AssetManager asset, String
path) {
1180 ArrayList<String>
res =
new ArrayList<String>();
1187 if (isDir !=
null && isDir.length > 0)
1190 }
catch (Exception
e) {
1191 e.printStackTrace();
1195 }
catch (Exception
e) {
1196 e.printStackTrace();
1198 return res.toArray(
new String[
res.size()]);
1210 android.system.Os.setenv(
key,
value,
true);
1211 }
catch (Exception
e) {
1213 e.printStackTrace();
1226 for (String
variable : environmentVariables.split(
"\t")) {
1227 String[] keyvalue =
variable.split(
"=", 2);
1228 if (keyvalue.length < 2 || keyvalue[0].isEmpty())
1237 int availableLeftPixels,
int availableTopPixels,
1238 int availableWidthPixels,
int availableHeightPixels,
1239 double XDpi,
double YDpi,
double scaledDensity,
1240 double density,
float refreshRate);
1253 public static native
void mouseWheel(
int winId,
int x,
int y,
float hdelta,
float vdelta);
1255 public static native
void touchAdd(
int winId,
int pointerId,
int action,
boolean primary,
int x,
int y,
float major,
float minor,
float rotation,
float pressure);
1256 public static native
void touchEnd(
int winId,
int action);
1267 public static native
void keyDown(
int key,
int unicode,
int modifier,
boolean autoRepeat);
1268 public static native
void keyUp(
int key,
int unicode,
int modifier,
boolean autoRepeat);
1321 public static native IBinder
onBind(Intent intent);
qsizetype length() const noexcept
boolean isKeyboardVisible()
void notifyQtAndroidPluginRunning(boolean running)
void notifyObjectFocus(int viewId)
void insertNativeView(int id, View view, int x, int y, int w, int h)
void notifyScrolledEvent(int viewId)
void updateSelection(int selStart, int selEnd, int candidatesStart, int candidatesEnd)
void setSystemUiVisibility(int systemUiVisibility)
void notifyObjectHide(int viewId, int parentId)
void notifyValueChanged(int viewId, String value)
void bringChildToBack(int id)
void showSoftwareKeyboard(final int x, final int y, final int width, final int height, final int inputHints, final int enterKeyType)
void createSurface(int id, boolean onTop, int x, int y, int w, int h, int imageDepth)
int getSelectHandleWidth()
void setSurfaceGeometry(int id, int x, int y, int w, int h)
void openContextMenu(final int x, final int y, final int w, final int h)
void notifyAccessibilityLocationChange(int viewId)
void updateHandles(int mode, int editX, int editY, int editButtons, int x1, int y1, int x2, int y2, boolean rtl)
static final int ApplicationActive
void bringChildToFront(int id)
void hideSoftwareKeyboard()
void initializeAccessibility()
void destroySurface(int id)
void resetSoftwareKeyboard()
static final String systemLibrariesDir
static boolean startApplication(String params, String mainLib)
static native void quitQtAndroidPlugin()
static native void handleScreenAdded(int displayId)
static native void mouseDown(int winId, int x, int y)
static native void setSurface(int id, Object surface, int w, int h)
static native void keyUp(int key, int unicode, int modifier, boolean autoRepeat)
static boolean hasClipboardText()
static boolean hasClipboardHtml()
static final int IdCursorHandle
static native IBinder onBind(Intent intent)
static native void touchEnd(int winId, int action)
static Size getDisplaySize(Context displayContext, Display display)
static native void terminateQt()
static void setEnvironmentVariables(String environmentVariables)
static native void mouseUp(int winId, int x, int y)
static QtThread m_qtThread
static native void runPendingCppRunnables()
static ClassLoader classLoader()
static native void handleScreenRemoved(int displayId)
static native void fillContextMenu(Menu menu)
static native void onActivityResult(int requestCode, int resultCode, Intent data)
static void sendTrackballEvent(MotionEvent event, int id)
static native void tabletEvent(int winId, int deviceId, long time, int action, int pointerType, int buttonState, float x, float y, float pressure)
static native void keyboardGeometryChanged(int x, int y, int width, int height)
static final int IdLeftHandle
static boolean hasClipboardUri()
static boolean openURL(Context context, String url, String mime)
static void setService(Service qtMainService, QtServiceDelegate qtServiceDelegate)
static Activity activity()
static native void longPress(int winId, int x, int y)
static native void mouseMove(int winId, int x, int y)
static native void sendRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
static native boolean isTabletEventSupported()
static native boolean dispatchGenericMotionEvent(MotionEvent ev)
static void setApplicationState(int state)
static native void touchAdd(int winId, int pointerId, int action, boolean primary, int x, int y, float major, float minor, float rotation, float pressure)
static Object m_mainActivityMutex
static void keyboardVisibilityUpdated(boolean visibility)
static native void keyboardVisibilityChanged(boolean visibility)
static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels, int availableLeftPixels, int availableTopPixels, int availableWidthPixels, int availableHeightPixels, double XDpi, double YDpi, double scaledDensity, double density, float refreshRate)
static native boolean onPrepareOptionsMenu(Menu menu)
static native boolean onContextItemSelected(int itemId, boolean checked)
static final String QtTAG
static QtActivityDelegate activityDelegate()
static String loadMainLibrary(final String mainLibrary, final String nativeLibraryDir)
static native void onCreateContextMenu(ContextMenu menu)
static List< Display > getAvailableDisplays()
static native void quitQtCoreApplication()
static native boolean startQtAndroidPlugin(String params)
static native boolean onOptionsItemSelected(int itemId, boolean checked)
static native void handleUiDarkModeChanged(int newUiMode)
static void notifyQtAndroidPluginRunning(final boolean running)
static native void handleScreenChanged(int displayId)
static String[] getStringArray(String joinedString)
static void setActivity(Activity qtMainActivity, QtActivityDelegate qtActivityDelegate)
static void loadBundledLibraries(final ArrayList< String > libraries, final String nativeLibraryDir)
static native void waitForServiceSetup()
static void setEnvironmentVariable(String key, String value)
static native void handleOrientationChanged(int newRotation, int nativeOrientation)
static boolean isStarted()
static Display getDisplay(int displayId)
static native void onNewIntent(Intent data)
static native void startQtApplication()
static native void updateApplicationState(int state)
static boolean isSoftwareKeyboardVisible()
static native boolean dispatchKeyEvent(KeyEvent event)
static native void onClipboardDataChanged()
static native void onContextMenuClosed(Menu menu)
static Context getContext()
static boolean sendGenericMotionEvent(MotionEvent event, int id)
static native void updateWindow()
static native void mouseWheel(int winId, int x, int y, float hdelta, float vdelta)
static QtServiceDelegate serviceDelegate()
static native void keyDown(int key, int unicode, int modifier, boolean autoRepeat)
static native void handleRefreshRateChanged(float refreshRate)
static native boolean updateNativeActivity()
static void loadQtLibraries(final ArrayList< String > libraries)
static native void onOptionsMenuClosed(Menu menu)
static boolean sendMouseEvent(MotionEvent event, int id)
static int checkSelfPermission(String permission)
static void setApplicationDisplayMetrics(int screenWidthPixels, int screenHeightPixels, int availableLeftPixels, int availableTopPixels, int availableWidthPixels, int availableHeightPixels, double XDpi, double YDpi, double scaledDensity, double density, float refreshRate)
static final int IdRightHandle
static void sendTouchEvent(MotionEvent event, int id)
static native void handleLocationChanged(int id, int x, int y)
static native void touchBegin(int winId)
static native void touchCancel(int winId)
static void setClassLoader(ClassLoader classLoader)
void run(final Runnable runnable)
void post(final Runnable runnable)
struct wl_display * display
auto run(QThreadPool *pool, Function &&f, Args &&...args)
static Q_CONSTINIT QBasicAtomicInt running
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLuint GLfloat GLfloat GLfloat GLfloat y1
GLuint GLfloat GLfloat GLfloat x1
GLsizei const GLchar ** strings
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat GLfloat GLfloat h
GLfixed GLfixed GLfixed y2
GLsizei const GLchar *const * path
static QPointingDevice::PointerType pointerType(unsigned currentCursor)
QFileInfo info(fileName)
[8]
QUrl url("example.com")
[constructor-url-reference]
application x qt windows mime
[2]
QItemEditorFactory * factory
QNetworkAccessManager manager