diff --git a/src/android/jar/CMakeLists.txt b/src/android/jar/CMakeLists.txt index 3e05d7a35d..3a3144a41c 100644 --- a/src/android/jar/CMakeLists.txt +++ b/src/android/jar/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2022 The Qt Company Ltd. +# Copyright (C) 2023 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause set(java_sources @@ -9,6 +9,9 @@ set(java_sources src/org/qtproject/qt/android/EditPopupMenu.java src/org/qtproject/qt/android/ExtractStyle.java src/org/qtproject/qt/android/QtActivityDelegate.java + src/org/qtproject/qt/android/QtLoader.java + src/org/qtproject/qt/android/QtActivityLoader.java + src/org/qtproject/qt/android/QtServiceLoader.java src/org/qtproject/qt/android/QtEditText.java src/org/qtproject/qt/android/QtInputConnection.java src/org/qtproject/qt/android/QtLayout.java diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityLoader.java similarity index 81% rename from src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java rename to src/android/jar/src/org/qtproject/qt/android/QtActivityLoader.java index 7824ddd4a0..1c8cc99950 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityLoader.java @@ -1,30 +1,24 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // Copyright (c) 2016, BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -package org.qtproject.qt.android.bindings; +package org.qtproject.qt.android; -import android.app.AlertDialog; -import android.content.DialogInterface; +import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; -import android.graphics.drawable.ColorDrawable; -import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.view.Window; -import org.qtproject.qt.android.QtNative; - import java.lang.reflect.Field; public class QtActivityLoader extends QtLoader { - QtActivity m_activity; + Activity m_activity; - QtActivityLoader(QtActivity activity) + public QtActivityLoader(Activity activity, Class clazz) { - super(activity, QtActivity.class); + super(activity, clazz); m_activity = activity; } @@ -60,7 +54,8 @@ public class QtActivityLoader extends QtLoader { public void onCreate(Bundle savedInstanceState) { try { - m_contextInfo = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(), PackageManager.GET_META_DATA); + m_contextInfo = m_activity.getPackageManager().getActivityInfo( + m_activity.getComponentName(), PackageManager.GET_META_DATA); int theme = ((ActivityInfo)m_contextInfo).getThemeResource(); for (Field f : Class.forName("android.R$style").getDeclaredFields()) { if (f.getInt(null) == theme) { @@ -76,7 +71,8 @@ public class QtActivityLoader extends QtLoader { } try { - m_activity.setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null)); + m_activity.setTheme(Class.forName("android.R$style").getDeclaredField( + QT_ANDROID_DEFAULT_THEME).getInt(null)); } catch (Exception e) { e.printStackTrace(); } @@ -93,8 +89,8 @@ public class QtActivityLoader extends QtLoader { } // there can only be a valid delegate object if the QtNative was started. - if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) - QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState); + if (m_delegateObject != null && onCreate != null) + invokeDelegateMethod(onCreate, savedInstanceState); return; } diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java b/src/android/jar/src/org/qtproject/qt/android/QtLoader.java similarity index 76% rename from src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java rename to src/android/jar/src/org/qtproject/qt/android/QtLoader.java index dcb0941556..3a1052b98f 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtLoader.java @@ -1,8 +1,8 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // Copyright (c) 2019, BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -package org.qtproject.qt.android.bindings; +package org.qtproject.qt.android; import android.app.AlertDialog; import android.app.Dialog; @@ -18,6 +18,7 @@ import android.util.Log; import java.io.File; import java.io.FileOutputStream; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -28,6 +29,7 @@ import dalvik.system.DexClassLoader; public abstract class QtLoader { + static String QtTAG = "Qt"; public static final String ERROR_CODE_KEY = "error.code"; public static final String ERROR_MESSAGE_KEY = "error.message"; public static final String DEX_PATH_KEY = "dex.path"; @@ -80,11 +82,130 @@ public abstract class QtLoader { private static ArrayList m_fileOutputStreams = new ArrayList(); // List of open file streams associated with files copied during installation. - QtLoader(ContextWrapper context, Class clazz) { + public static Object m_delegateObject = null; + public static HashMap> m_delegateMethods= new HashMap>(); + public static Method dispatchKeyEvent = null; + public static Method dispatchPopulateAccessibilityEvent = null; + public static Method dispatchTouchEvent = null; + public static Method dispatchTrackballEvent = null; + public static Method onKeyDown = null; + public static Method onKeyMultiple = null; + public static Method onKeyUp = null; + public static Method onTouchEvent = null; + public static Method onTrackballEvent = null; + public static Method onActivityResult = null; + public static Method onCreate = null; + public static Method onKeyLongPress = null; + public static Method dispatchKeyShortcutEvent = null; + public static Method onKeyShortcut = null; + public static Method dispatchGenericMotionEvent = null; + public static Method onGenericMotionEvent = null; + public static Method onRequestPermissionsResult = null; + private static String activityClassName; + private static Class qtApplicationClass = null; + + public QtLoader(ContextWrapper context, Class clazz) { m_context = context; m_delegateClass = clazz; } + public static void setQtApplicationClass(Class qtAppClass) + { + qtApplicationClass = qtAppClass; + } + + public static void setQtTAG(String tag) + { + QtTAG = tag; + } + + public static void setQtContextDelegate(Class clazz, Object listener) + { + m_delegateObject = listener; + activityClassName = clazz.getCanonicalName(); + + ArrayList delegateMethods = new ArrayList(); + for (Method m : listener.getClass().getMethods()) { + if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt.android")) + delegateMethods.add(m); + } + + ArrayList applicationFields = new ArrayList(); + for (Field f : qtApplicationClass.getFields()) { + if (f.getDeclaringClass().getName().equals(qtApplicationClass.getName())) + applicationFields.add(f); + } + + for (Method delegateMethod : delegateMethods) { + try { + clazz.getDeclaredMethod(delegateMethod.getName(), delegateMethod.getParameterTypes()); + if (m_delegateMethods.containsKey(delegateMethod.getName())) { + m_delegateMethods.get(delegateMethod.getName()).add(delegateMethod); + } else { + ArrayList delegateSet = new ArrayList(); + delegateSet.add(delegateMethod); + m_delegateMethods.put(delegateMethod.getName(), delegateSet); + } + for (Field applicationField:applicationFields) { + if (applicationField.getName().equals(delegateMethod.getName())) { + try { + applicationField.set(null, delegateMethod); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { } + } + } + + public static class InvokeResult + { + public boolean invoked = false; + public Object methodReturns = null; + } + + private static int stackDeep=-1; + public static InvokeResult invokeDelegate(Object... args) + { + InvokeResult result = new InvokeResult(); + if (m_delegateObject == null) + return result; + StackTraceElement[] elements = Thread.currentThread().getStackTrace(); + if (-1 == stackDeep) { + for (int it=0;it= 28) { - Log.e(QtApplication.QtTAG, "extract_android_style option set to \"none\" when targetSdkVersion is less then 28"); + Log.e(QtTAG, "extract_android_style option set to \"none\" when targetSdkVersion is less then 28"); extractOption = "none"; } } @@ -380,7 +501,7 @@ public abstract class QtLoader { return; } } catch (Exception e) { - Log.e(QtApplication.QtTAG, "Can't create main activity", e); + Log.e(QtTAG, "Can't create main activity", e); } } } diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java b/src/android/jar/src/org/qtproject/qt/android/QtServiceLoader.java similarity index 66% rename from src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java rename to src/android/jar/src/org/qtproject/qt/android/QtServiceLoader.java index 5511266305..d5f7167b7a 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtServiceLoader.java @@ -1,32 +1,37 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // Copyright (c) 2016, BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -package org.qtproject.qt.android.bindings; +package org.qtproject.qt.android; +import android.app.Service; import android.os.Bundle; import android.content.ComponentName; import android.content.pm.PackageManager; +import java.security.Provider; + public class QtServiceLoader extends QtLoader { - QtService m_service; - QtServiceLoader(QtService service) { - super(service, QtService.class); + Service m_service; + + public QtServiceLoader(Service service, Class clazz) { + super(service, clazz); m_service = service; } public void onCreate() { try { - m_contextInfo = m_service.getPackageManager().getServiceInfo(new ComponentName(m_service, m_service.getClass()), PackageManager.GET_META_DATA); + m_contextInfo = m_service.getPackageManager().getServiceInfo(new ComponentName( + m_service, m_service.getClass()), PackageManager.GET_META_DATA); } catch (Exception e) { e.printStackTrace(); m_service.stopSelf(); return; } - if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) { + if (m_delegateObject != null && onCreate != null) { Bundle bundle = null; - QtApplication.invokeDelegateMethod(QtApplication.onCreate, bundle); + invokeDelegateMethod(onCreate, bundle); } startApp(true); } diff --git a/src/android/java/CMakeLists.txt b/src/android/java/CMakeLists.txt index 32697410eb..2ff2fb5791 100644 --- a/src/android/java/CMakeLists.txt +++ b/src/android/java/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2022 The Qt Company Ltd. +# Copyright (C) 2023 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause # Android Java Resource files @@ -10,11 +10,8 @@ set(resource_directories set(java_bindings "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtActivity.java" - "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtActivityLoader.java" "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtService.java" - "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtServiceLoader.java" "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtApplication.java" - "${CMAKE_CURRENT_SOURCE_DIR}/src/org/qtproject/qt/android/bindings/QtLoader.java" ) set(strings_resouces @@ -57,3 +54,13 @@ if(NOT QT_WILL_INSTALL) DIRECTORIES ${resource_directories} DESTINATION ${destination}) endif() + +# To avoid Java build errors after the loader classes have been moved to the internal Jar package, +# make this step to remove them from the build folder. This mainly useful for existing builds, +# as clean builds wouldn't have to deal with this case. +if ("${PROJECT_VERSION}" GREATER_EQUAL "6.7") + set(loader_bindings "QtLoader.java" "QtActivityLoader.java" "QtServiceLoader.java") + foreach(binding IN LISTS loader_bindings) + file(REMOVE "${destination}/src/org/qtproject/qt/android/bindings/${binding}") + endforeach() +endif() diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java index f85218c154..28f3808433 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java @@ -1,4 +1,4 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // Copyright (c) 2016, BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause @@ -32,6 +32,10 @@ import android.view.accessibility.AccessibilityEvent; import org.qtproject.qt.android.QtNative; +import org.qtproject.qt.android.QtActivityLoader; +import org.qtproject.qt.android.QtLoader; + + public class QtActivity extends Activity { public static final String EXTRA_SOURCE_INFO = "org.qtproject.qt.android.sourceInfo"; @@ -65,7 +69,7 @@ public class QtActivity extends Activity private QtActivityLoader m_loader; public QtActivity() { - m_loader = new QtActivityLoader(this); + m_loader = new QtActivityLoader(this, QtActivity.class); if (Build.VERSION.SDK_INT < 29) { QT_ANDROID_THEMES = new String[] {"Theme_Holo_Light"}; @@ -85,8 +89,8 @@ public class QtActivity extends Activity @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchKeyEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchKeyEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchKeyEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchKeyEvent, event); else return super.dispatchKeyEvent(event); } @@ -99,8 +103,8 @@ public class QtActivity extends Activity @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchPopulateAccessibilityEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchPopulateAccessibilityEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchPopulateAccessibilityEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchPopulateAccessibilityEvent, event); else return super.dispatchPopulateAccessibilityEvent(event); } @@ -113,8 +117,8 @@ public class QtActivity extends Activity @Override public boolean dispatchTouchEvent(MotionEvent ev) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchTouchEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchTouchEvent, ev); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchTouchEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchTouchEvent, ev); else return super.dispatchTouchEvent(ev); } @@ -127,8 +131,8 @@ public class QtActivity extends Activity @Override public boolean dispatchTrackballEvent(MotionEvent ev) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchTrackballEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchTrackballEvent, ev); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchTrackballEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchTrackballEvent, ev); else return super.dispatchTrackballEvent(ev); } @@ -142,8 +146,8 @@ public class QtActivity extends Activity protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (QtApplication.m_delegateObject != null && QtApplication.onActivityResult != null) { - QtApplication.invokeDelegateMethod(QtApplication.onActivityResult, requestCode, resultCode, data); + if (QtLoader.m_delegateObject != null && QtLoader.onActivityResult != null) { + QtLoader.invokeDelegateMethod(QtLoader.onActivityResult, requestCode, resultCode, data); return; } super.onActivityResult(requestCode, resultCode, data); @@ -157,7 +161,7 @@ public class QtActivity extends Activity @Override protected void onApplyThemeResource(Theme theme, int resid, boolean first) { - if (!QtApplication.invokeDelegate(theme, resid, first).invoked) + if (!QtLoader.invokeDelegate(theme, resid, first).invoked) super.onApplyThemeResource(theme, resid, first); } public void super_onApplyThemeResource(Theme theme, int resid, boolean first) @@ -170,7 +174,7 @@ public class QtActivity extends Activity @Override protected void onChildTitleChanged(Activity childActivity, CharSequence title) { - if (!QtApplication.invokeDelegate(childActivity, title).invoked) + if (!QtLoader.invokeDelegate(childActivity, title).invoked) super.onChildTitleChanged(childActivity, title); } public void super_onChildTitleChanged(Activity childActivity, CharSequence title) @@ -182,7 +186,7 @@ public class QtActivity extends Activity @Override public void onConfigurationChanged(Configuration newConfig) { - if (!QtApplication.invokeDelegate(newConfig).invoked) + if (!QtLoader.invokeDelegate(newConfig).invoked) super.onConfigurationChanged(newConfig); } public void super_onConfigurationChanged(Configuration newConfig) @@ -194,7 +198,7 @@ public class QtActivity extends Activity @Override public void onContentChanged() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onContentChanged(); } public void super_onContentChanged() @@ -206,7 +210,7 @@ public class QtActivity extends Activity @Override public boolean onContextItemSelected(MenuItem item) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(item); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(item); if (res.invoked) return (Boolean)res.methodReturns; else @@ -221,7 +225,7 @@ public class QtActivity extends Activity @Override public void onContextMenuClosed(Menu menu) { - if (!QtApplication.invokeDelegate(menu).invoked) + if (!QtLoader.invokeDelegate(menu).invoked) super.onContextMenuClosed(menu); } public void super_onContextMenuClosed(Menu menu) @@ -263,6 +267,7 @@ public class QtActivity extends Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + QtLoader.setQtApplicationClass(QtApplication.class); onCreateHook(savedInstanceState); addReferrer(getIntent()); } @@ -271,7 +276,7 @@ public class QtActivity extends Activity @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - if (!QtApplication.invokeDelegate(menu, v, menuInfo).invoked) + if (!QtLoader.invokeDelegate(menu, v, menuInfo).invoked) super.onCreateContextMenu(menu, v, menuInfo); } public void super_onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) @@ -283,7 +288,7 @@ public class QtActivity extends Activity @Override public CharSequence onCreateDescription() { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(); if (res.invoked) return (CharSequence)res.methodReturns; else @@ -298,7 +303,7 @@ public class QtActivity extends Activity @Override protected Dialog onCreateDialog(int id) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(id); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(id); if (res.invoked) return (Dialog)res.methodReturns; else @@ -313,7 +318,7 @@ public class QtActivity extends Activity @Override public boolean onCreateOptionsMenu(Menu menu) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(menu); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(menu); if (res.invoked) return (Boolean)res.methodReturns; else @@ -328,7 +333,7 @@ public class QtActivity extends Activity @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, menu); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(featureId, menu); if (res.invoked) return (Boolean)res.methodReturns; else @@ -344,7 +349,7 @@ public class QtActivity extends Activity @Override public View onCreatePanelView(int featureId) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(featureId); if (res.invoked) return (View)res.methodReturns; else @@ -374,7 +379,7 @@ public class QtActivity extends Activity @Override public View onCreateView(String name, Context context, AttributeSet attrs) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(name, context, attrs); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(name, context, attrs); if (res.invoked) return (View)res.methodReturns; else @@ -390,7 +395,7 @@ public class QtActivity extends Activity protected void onDestroy() { super.onDestroy(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @@ -398,8 +403,8 @@ public class QtActivity extends Activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, keyCode, event); + if (QtLoader.m_delegateObject != null && QtLoader.onKeyDown != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onKeyDown, keyCode, event); else return super.onKeyDown(keyCode, event); } @@ -413,8 +418,8 @@ public class QtActivity extends Activity @Override public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onKeyMultiple != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyMultiple, keyCode, repeatCount, event); + if (QtLoader.m_delegateObject != null && QtLoader.onKeyMultiple != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onKeyMultiple, keyCode, repeatCount, event); else return super.onKeyMultiple(keyCode, repeatCount, event); } @@ -427,8 +432,8 @@ public class QtActivity extends Activity @Override public boolean onKeyUp(int keyCode, KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onKeyUp != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyUp, keyCode, event); + if (QtLoader.m_delegateObject != null && QtLoader.onKeyUp != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onKeyUp, keyCode, event); else return super.onKeyUp(keyCode, event); } @@ -441,7 +446,7 @@ public class QtActivity extends Activity @Override public void onLowMemory() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onLowMemory(); } //--------------------------------------------------------------------------- @@ -449,7 +454,7 @@ public class QtActivity extends Activity @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, item); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(featureId, item); if (res.invoked) return (Boolean)res.methodReturns; else @@ -464,7 +469,7 @@ public class QtActivity extends Activity @Override public boolean onMenuOpened(int featureId, Menu menu) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, menu); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(featureId, menu); if (res.invoked) return (Boolean)res.methodReturns; else @@ -480,7 +485,7 @@ public class QtActivity extends Activity protected void onNewIntent(Intent intent) { addReferrer(intent); - if (!QtApplication.invokeDelegate(intent).invoked) + if (!QtLoader.invokeDelegate(intent).invoked) super.onNewIntent(intent); } public void super_onNewIntent(Intent intent) @@ -492,7 +497,7 @@ public class QtActivity extends Activity @Override public boolean onOptionsItemSelected(MenuItem item) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(item); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(item); if (res.invoked) return (Boolean)res.methodReturns; else @@ -507,7 +512,7 @@ public class QtActivity extends Activity @Override public void onOptionsMenuClosed(Menu menu) { - if (!QtApplication.invokeDelegate(menu).invoked) + if (!QtLoader.invokeDelegate(menu).invoked) super.onOptionsMenuClosed(menu); } public void super_onOptionsMenuClosed(Menu menu) @@ -519,7 +524,7 @@ public class QtActivity extends Activity @Override public void onPanelClosed(int featureId, Menu menu) { - if (!QtApplication.invokeDelegate(featureId, menu).invoked) + if (!QtLoader.invokeDelegate(featureId, menu).invoked) super.onPanelClosed(featureId, menu); } public void super_onPanelClosed(int featureId, Menu menu) @@ -532,7 +537,7 @@ public class QtActivity extends Activity protected void onPause() { super.onPause(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @@ -540,7 +545,7 @@ public class QtActivity extends Activity protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - QtApplication.invokeDelegate(savedInstanceState); + QtLoader.invokeDelegate(savedInstanceState); } //--------------------------------------------------------------------------- @@ -548,14 +553,14 @@ public class QtActivity extends Activity protected void onPostResume() { super.onPostResume(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @Override protected void onPrepareDialog(int id, Dialog dialog) { - if (!QtApplication.invokeDelegate(id, dialog).invoked) + if (!QtLoader.invokeDelegate(id, dialog).invoked) super.onPrepareDialog(id, dialog); } public void super_onPrepareDialog(int id, Dialog dialog) @@ -567,7 +572,7 @@ public class QtActivity extends Activity @Override public boolean onPrepareOptionsMenu(Menu menu) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(menu); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(menu); if (res.invoked) return (Boolean)res.methodReturns; else @@ -582,7 +587,7 @@ public class QtActivity extends Activity @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, view, menu); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(featureId, view, menu); if (res.invoked) return (Boolean)res.methodReturns; else @@ -598,14 +603,14 @@ public class QtActivity extends Activity protected void onRestart() { super.onRestart(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { - if (!QtApplication.invokeDelegate(savedInstanceState).invoked) + if (!QtLoader.invokeDelegate(savedInstanceState).invoked) super.onRestoreInstanceState(savedInstanceState); } public void super_onRestoreInstanceState(Bundle savedInstanceState) @@ -618,14 +623,14 @@ public class QtActivity extends Activity protected void onResume() { super.onResume(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @Override public Object onRetainNonConfigurationInstance() { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(); if (res.invoked) return res.methodReturns; else @@ -640,7 +645,7 @@ public class QtActivity extends Activity @Override protected void onSaveInstanceState(Bundle outState) { - if (!QtApplication.invokeDelegate(outState).invoked) + if (!QtLoader.invokeDelegate(outState).invoked) super.onSaveInstanceState(outState); } public void super_onSaveInstanceState(Bundle outState) @@ -653,7 +658,7 @@ public class QtActivity extends Activity @Override public boolean onSearchRequested() { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(); if (res.invoked) return (Boolean)res.methodReturns; else @@ -669,7 +674,7 @@ public class QtActivity extends Activity protected void onStart() { super.onStart(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @@ -677,14 +682,14 @@ public class QtActivity extends Activity protected void onStop() { super.onStop(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @Override protected void onTitleChanged(CharSequence title, int color) { - if (!QtApplication.invokeDelegate(title, color).invoked) + if (!QtLoader.invokeDelegate(title, color).invoked) super.onTitleChanged(title, color); } public void super_onTitleChanged(CharSequence title, int color) @@ -696,8 +701,8 @@ public class QtActivity extends Activity @Override public boolean onTouchEvent(MotionEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onTouchEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onTouchEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.onTouchEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onTouchEvent, event); else return super.onTouchEvent(event); } @@ -710,8 +715,8 @@ public class QtActivity extends Activity @Override public boolean onTrackballEvent(MotionEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onTrackballEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onTrackballEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.onTrackballEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onTrackballEvent, event); else return super.onTrackballEvent(event); } @@ -724,7 +729,7 @@ public class QtActivity extends Activity @Override public void onUserInteraction() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onUserInteraction(); } public void super_onUserInteraction() @@ -736,7 +741,7 @@ public class QtActivity extends Activity @Override protected void onUserLeaveHint() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onUserLeaveHint(); } public void super_onUserLeaveHint() @@ -748,7 +753,7 @@ public class QtActivity extends Activity @Override public void onWindowAttributesChanged(LayoutParams params) { - if (!QtApplication.invokeDelegate(params).invoked) + if (!QtLoader.invokeDelegate(params).invoked) super.onWindowAttributesChanged(params); } public void super_onWindowAttributesChanged(LayoutParams params) @@ -760,7 +765,7 @@ public class QtActivity extends Activity @Override public void onWindowFocusChanged(boolean hasFocus) { - if (!QtApplication.invokeDelegate(hasFocus).invoked) + if (!QtLoader.invokeDelegate(hasFocus).invoked) super.onWindowFocusChanged(hasFocus); } public void super_onWindowFocusChanged(boolean hasFocus) @@ -774,7 +779,7 @@ public class QtActivity extends Activity @Override public void onAttachedToWindow() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onAttachedToWindow(); } public void super_onAttachedToWindow() @@ -786,7 +791,7 @@ public class QtActivity extends Activity @Override public void onBackPressed() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onBackPressed(); } public void super_onBackPressed() @@ -798,7 +803,7 @@ public class QtActivity extends Activity @Override public void onDetachedFromWindow() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onDetachedFromWindow(); } public void super_onDetachedFromWindow() @@ -810,8 +815,8 @@ public class QtActivity extends Activity @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onKeyLongPress != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyLongPress, keyCode, event); + if (QtLoader.m_delegateObject != null && QtLoader.onKeyLongPress != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onKeyLongPress, keyCode, event); else return super.onKeyLongPress(keyCode, event); } @@ -827,7 +832,7 @@ public class QtActivity extends Activity @Override protected Dialog onCreateDialog(int id, Bundle args) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(id, args); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(id, args); if (res.invoked) return (Dialog)res.methodReturns; else @@ -842,7 +847,7 @@ public class QtActivity extends Activity @Override protected void onPrepareDialog(int id, Dialog dialog, Bundle args) { - if (!QtApplication.invokeDelegate(id, dialog, args).invoked) + if (!QtLoader.invokeDelegate(id, dialog, args).invoked) super.onPrepareDialog(id, dialog, args); } public void super_onPrepareDialog(int id, Dialog dialog, Bundle args) @@ -857,8 +862,8 @@ public class QtActivity extends Activity @Override public boolean dispatchKeyShortcutEvent(KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchKeyShortcutEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchKeyShortcutEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchKeyShortcutEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchKeyShortcutEvent, event); else return super.dispatchKeyShortcutEvent(event); } @@ -871,7 +876,7 @@ public class QtActivity extends Activity @Override public void onActionModeFinished(ActionMode mode) { - if (!QtApplication.invokeDelegate(mode).invoked) + if (!QtLoader.invokeDelegate(mode).invoked) super.onActionModeFinished(mode); } public void super_onActionModeFinished(ActionMode mode) @@ -883,7 +888,7 @@ public class QtActivity extends Activity @Override public void onActionModeStarted(ActionMode mode) { - if (!QtApplication.invokeDelegate(mode).invoked) + if (!QtLoader.invokeDelegate(mode).invoked) super.onActionModeStarted(mode); } public void super_onActionModeStarted(ActionMode mode) @@ -895,7 +900,7 @@ public class QtActivity extends Activity @Override public void onAttachFragment(Fragment fragment) { - if (!QtApplication.invokeDelegate(fragment).invoked) + if (!QtLoader.invokeDelegate(fragment).invoked) super.onAttachFragment(fragment); } public void super_onAttachFragment(Fragment fragment) @@ -907,7 +912,7 @@ public class QtActivity extends Activity @Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(parent, name, context, attrs); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(parent, name, context, attrs); if (res.invoked) return (View)res.methodReturns; else @@ -922,8 +927,8 @@ public class QtActivity extends Activity @Override public boolean onKeyShortcut(int keyCode, KeyEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onKeyShortcut != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyShortcut, keyCode,event); + if (QtLoader.m_delegateObject != null && QtLoader.onKeyShortcut != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onKeyShortcut, keyCode,event); else return super.onKeyShortcut(keyCode, event); } @@ -936,7 +941,7 @@ public class QtActivity extends Activity @Override public ActionMode onWindowStartingActionMode(Callback callback) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(callback); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(callback); if (res.invoked) return (ActionMode)res.methodReturns; else @@ -954,8 +959,8 @@ public class QtActivity extends Activity @Override public boolean dispatchGenericMotionEvent(MotionEvent ev) { - if (QtApplication.m_delegateObject != null && QtApplication.dispatchGenericMotionEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchGenericMotionEvent, ev); + if (QtLoader.m_delegateObject != null && QtLoader.dispatchGenericMotionEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.dispatchGenericMotionEvent, ev); else return super.dispatchGenericMotionEvent(ev); } @@ -968,8 +973,8 @@ public class QtActivity extends Activity @Override public boolean onGenericMotionEvent(MotionEvent event) { - if (QtApplication.m_delegateObject != null && QtApplication.onGenericMotionEvent != null) - return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onGenericMotionEvent, event); + if (QtLoader.m_delegateObject != null && QtLoader.onGenericMotionEvent != null) + return (Boolean) QtLoader.invokeDelegateMethod(QtLoader.onGenericMotionEvent, event); else return super.onGenericMotionEvent(event); } @@ -982,8 +987,8 @@ public class QtActivity extends Activity public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - if (QtApplication.m_delegateObject != null && QtApplication.onRequestPermissionsResult != null) { - QtApplication.invokeDelegateMethod(QtApplication.onRequestPermissionsResult, requestCode , permissions, grantResults); + if (QtLoader.m_delegateObject != null && QtLoader.onRequestPermissionsResult != null) { + QtLoader.invokeDelegateMethod(QtLoader.onRequestPermissionsResult, requestCode , permissions, grantResults); return; } } diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtApplication.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtApplication.java index cb6de3a7c5..b89946b9a5 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtApplication.java +++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtApplication.java @@ -1,130 +1,33 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // Copyright (c) 2016, BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause package org.qtproject.qt.android.bindings; import android.app.Application; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; +import org.qtproject.qt.android.QtLoader; public class QtApplication extends Application { public final static String QtTAG = "Qt"; - public static Object m_delegateObject = null; - public static HashMap> m_delegateMethods= new HashMap>(); - public static Method dispatchKeyEvent = null; - public static Method dispatchPopulateAccessibilityEvent = null; - public static Method dispatchTouchEvent = null; - public static Method dispatchTrackballEvent = null; - public static Method onKeyDown = null; - public static Method onKeyMultiple = null; - public static Method onKeyUp = null; - public static Method onTouchEvent = null; - public static Method onTrackballEvent = null; - public static Method onActivityResult = null; - public static Method onCreate = null; - public static Method onKeyLongPress = null; - public static Method dispatchKeyShortcutEvent = null; - public static Method onKeyShortcut = null; - public static Method dispatchGenericMotionEvent = null; - public static Method onGenericMotionEvent = null; - public static Method onRequestPermissionsResult = null; - private static String activityClassName; - public static void setQtContextDelegate(Class clazz, Object listener) - { - m_delegateObject = listener; - activityClassName = clazz.getCanonicalName(); - - ArrayList delegateMethods = new ArrayList(); - for (Method m : listener.getClass().getMethods()) { - if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt.android")) - delegateMethods.add(m); - } - - ArrayList applicationFields = new ArrayList(); - for (Field f : QtApplication.class.getFields()) { - if (f.getDeclaringClass().getName().equals(QtApplication.class.getName())) - applicationFields.add(f); - } - - for (Method delegateMethod : delegateMethods) { - try { - clazz.getDeclaredMethod(delegateMethod.getName(), delegateMethod.getParameterTypes()); - if (QtApplication.m_delegateMethods.containsKey(delegateMethod.getName())) { - QtApplication.m_delegateMethods.get(delegateMethod.getName()).add(delegateMethod); - } else { - ArrayList delegateSet = new ArrayList(); - delegateSet.add(delegateMethod); - QtApplication.m_delegateMethods.put(delegateMethod.getName(), delegateSet); - } - for (Field applicationField:applicationFields) { - if (applicationField.getName().equals(delegateMethod.getName())) { - try { - applicationField.set(null, delegateMethod); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } catch (Exception e) { } - } - } @Override public void onTerminate() { - if (m_delegateObject != null && m_delegateMethods.containsKey("onTerminate")) - invokeDelegateMethod(m_delegateMethods.get("onTerminate").get(0)); + if (QtLoader.m_delegateObject != null && QtLoader.m_delegateMethods.containsKey("onTerminate")) + QtLoader.invokeDelegateMethod(QtLoader.m_delegateMethods.get("onTerminate").get(0)); super.onTerminate(); } + // TODO: only keep around for avoid build errors, will be removed. public static class InvokeResult { public boolean invoked = false; public Object methodReturns = null; } - private static int stackDeep=-1; public static InvokeResult invokeDelegate(Object... args) { InvokeResult result = new InvokeResult(); - if (m_delegateObject == null) - return result; - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (-1 == stackDeep) { - for (int it=0;it // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause @@ -12,10 +12,12 @@ import android.os.Bundle; import android.os.IBinder; import org.qtproject.qt.android.QtNative; +import org.qtproject.qt.android.QtServiceLoader; +import org.qtproject.qt.android.QtLoader; public class QtService extends Service { - QtServiceLoader m_loader = new QtServiceLoader(this); + QtServiceLoader m_loader = new QtServiceLoader(this, QtService.class); /////////////////////////// forward all notifications //////////////////////////// @@ -47,14 +49,14 @@ public class QtService extends Service public void onDestroy() { super.onDestroy(); - QtApplication.invokeDelegate(); + QtLoader.invokeDelegate(); } //--------------------------------------------------------------------------- @Override public IBinder onBind(Intent intent) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(intent); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(intent); if (res.invoked) return (IBinder)res.methodReturns; else @@ -65,7 +67,7 @@ public class QtService extends Service @Override public void onConfigurationChanged(Configuration newConfig) { - if (!QtApplication.invokeDelegate(newConfig).invoked) + if (!QtLoader.invokeDelegate(newConfig).invoked) super.onConfigurationChanged(newConfig); } public void super_onConfigurationChanged(Configuration newConfig) @@ -77,7 +79,7 @@ public class QtService extends Service @Override public void onLowMemory() { - if (!QtApplication.invokeDelegate().invoked) + if (!QtLoader.invokeDelegate().invoked) super.onLowMemory(); } //--------------------------------------------------------------------------- @@ -85,7 +87,7 @@ public class QtService extends Service @Override public int onStartCommand(Intent intent, int flags, int startId) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(intent, flags, startId); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(intent, flags, startId); if (res.invoked) return (Integer) res.methodReturns; else @@ -100,7 +102,7 @@ public class QtService extends Service @Override public void onTaskRemoved(Intent rootIntent) { - if (!QtApplication.invokeDelegate(rootIntent).invoked) + if (!QtLoader.invokeDelegate(rootIntent).invoked) super.onTaskRemoved(rootIntent); } public void super_onTaskRemoved(Intent rootIntent) @@ -112,7 +114,7 @@ public class QtService extends Service @Override public void onTrimMemory(int level) { - if (!QtApplication.invokeDelegate(level).invoked) + if (!QtLoader.invokeDelegate(level).invoked) super.onTrimMemory(level); } public void super_onTrimMemory(int level) @@ -124,7 +126,7 @@ public class QtService extends Service @Override public boolean onUnbind(Intent intent) { - QtApplication.InvokeResult res = QtApplication.invokeDelegate(intent); + QtLoader.InvokeResult res = QtLoader.invokeDelegate(intent); if (res.invoked) return (Boolean) res.methodReturns; else