summaryrefslogtreecommitdiffstats
path: root/src/android/java
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2022-09-30 14:33:40 +0300
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2023-10-12 11:59:32 +0300
commitd1760bc8100c94a831f80080a5433a360266c5e2 (patch)
tree1eeb4307d556fb308cade5bb873910316e76d221 /src/android/java
parentc03eb94c8a4c776a0315acc35538b3954e031222 (diff)
Android: Simplify the user facing Java bindings
Move QtLoader classes outside of the bindings package and into the internal Android Java package (Qt6Android.jar that is), to simplify Qt for Android project templates. This is because QtLoader classes are used to trigger Qt libs loading and the users don't need to necessarily know about it or find it in the project's source files. The classes in question: QtLoader, QtActivityLoader, and QtServiceLoader. Task-number: QTBUG-115014 Task-number: QTBUG-114593 Change-Id: I61f68abf6ee83fc45bc47ed9af7457db4f7deabc Reviewed-by: Tinja Paavoseppä <tinja.paavoseppa@qt.io>
Diffstat (limited to 'src/android/java')
-rw-r--r--src/android/java/CMakeLists.txt15
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtActivity.java173
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java117
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtApplication.java107
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java386
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtService.java22
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java48
7 files changed, 117 insertions, 751 deletions
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 <bogdan@kde.org>
// 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/QtActivityLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java
deleted file mode 100644
index 7824ddd4a0..0000000000
--- a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// Copyright (c) 2016, BogDan Vatra <bogdan@kde.org>
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-
-package org.qtproject.qt.android.bindings;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-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;
-
- QtActivityLoader(QtActivity activity)
- {
- super(activity, QtActivity.class);
- m_activity = activity;
- }
-
- @Override
- protected String loaderClassName() {
- return "org.qtproject.qt.android.QtActivityDelegate";
- }
-
- @Override
- protected Class<?> contextClassName() {
- return android.app.Activity.class;
- }
-
- @Override
- protected void finish() {
- m_activity.finish();
- }
-
- @Override
- protected String getTitle() {
- return (String) m_activity.getTitle();
- }
-
- @Override
- protected void runOnUiThread(Runnable run) {
- m_activity.runOnUiThread(run);
- }
-
- @Override
- Intent getIntent() {
- return m_activity.getIntent();
- }
-
- public void onCreate(Bundle savedInstanceState) {
- try {
- 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) {
- QT_ANDROID_THEMES = new String[] {f.getName()};
- QT_ANDROID_DEFAULT_THEME = f.getName();
- break;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- finish();
- return;
- }
-
- try {
- m_activity.setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- m_activity.requestWindowFeature(Window.FEATURE_ACTION_BAR);
- if (QtNative.isStarted()) {
- boolean updated = QtNative.activityDelegate().updateActivity(m_activity);
- if (!updated) {
- // could not update the activity so restart the application
- Intent intent = Intent.makeRestartActivityTask(m_activity.getComponentName());
- m_activity.startActivity(intent);
- QtNative.quitApp();
- Runtime.getRuntime().exit(0);
- }
-
- // 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);
-
- return;
- }
-
- m_displayDensity = m_activity.getResources().getDisplayMetrics().densityDpi;
-
- ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
- + "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + m_displayDensity + "\t";
-
- if (m_contextInfo.metaData.containsKey("android.app.background_running")
- && m_contextInfo.metaData.getBoolean("android.app.background_running")) {
- ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=0\t";
- } else {
- ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t";
- }
-
- startApp(true);
-
- }
-}
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 <bogdan@kde.org>
// 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<String, ArrayList<Method>> m_delegateMethods= new HashMap<String, ArrayList<Method>>();
- 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<Method> delegateMethods = new ArrayList<Method>();
- for (Method m : listener.getClass().getMethods()) {
- if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt.android"))
- delegateMethods.add(m);
- }
-
- ArrayList<Field> applicationFields = new ArrayList<Field>();
- 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<Method> delegateSet = new ArrayList<Method>();
- 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<elements.length;it++)
- if (elements[it].getClassName().equals(activityClassName)) {
- stackDeep = it;
- break;
- }
- }
- if (-1 == stackDeep)
- return result;
-
- final String methodName=elements[stackDeep].getMethodName();
- if (!m_delegateMethods.containsKey(methodName))
- return result;
-
- for (Method m : m_delegateMethods.get(methodName)) {
- if (m.getParameterTypes().length == args.length) {
- result.methodReturns = invokeDelegateMethod(m, args);
- result.invoked = true;
- return result;
- }
- }
return result;
}
-
- public static Object invokeDelegateMethod(Method m, Object... args)
- {
- try {
- return m.invoke(m_delegateObject, args);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
}
diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java
deleted file mode 100644
index dcb0941556..0000000000
--- a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// Copyright (c) 2019, BogDan Vatra <bogdan@kde.org>
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-
-package org.qtproject.qt.android.bindings;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ComponentInfo;
-import android.content.res.Resources;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-import dalvik.system.DexClassLoader;
-
-public abstract class QtLoader {
-
- 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";
- public static final String LIB_PATH_KEY = "lib.path";
- public static final String LOADER_CLASS_NAME_KEY = "loader.class.name";
- public static final String NATIVE_LIBRARIES_KEY = "native.libraries";
- public static final String ENVIRONMENT_VARIABLES_KEY = "environment.variables";
- public static final String APPLICATION_PARAMETERS_KEY = "application.parameters";
- public static final String BUNDLED_LIBRARIES_KEY = "bundled.libraries";
- public static final String MAIN_LIBRARY_KEY = "main.library";
- public static final String STATIC_INIT_CLASSES_KEY = "static.init.classes";
- public static final String EXTRACT_STYLE_KEY = "extract.android.style";
- private static final String EXTRACT_STYLE_MINIMAL_KEY = "extract.android.style.option";
-
- // These parameters matter in case of deploying application as system (embedded into firmware)
- public static final String SYSTEM_LIB_PATH = "/system/lib/";
-
- public String APPLICATION_PARAMETERS = null; // use this variable to pass any parameters to your application,
- // the parameters must not contain any white spaces
- // and must be separated with "\t"
- // e.g "-param1\t-param2=value2\t-param3\tvalue3"
-
- public String ENVIRONMENT_VARIABLES = "QT_USE_ANDROID_NATIVE_DIALOGS=1";
- // use this variable to add any environment variables to your application.
- // the env vars must be separated with "\t"
- // e.g. "ENV_VAR1=1\tENV_VAR2=2\t"
- // Currently the following vars are used by the android plugin:
- // * QT_USE_ANDROID_NATIVE_DIALOGS -1 to use the android native dialogs.
-
- public String[] QT_ANDROID_THEMES = null; // A list with all themes that your application want to use.
- // The name of the theme must be the same with any theme from
- // http://developer.android.com/reference/android/R.style.html
- // The most used themes are:
- // * "Theme" - (fallback) check http://developer.android.com/reference/android/R.style.html#Theme
- // * "Theme_Black" - check http://developer.android.com/reference/android/R.style.html#Theme_Black
- // * "Theme_Light" - (default for API <=10) check http://developer.android.com/reference/android/R.style.html#Theme_Light
- // * "Theme_Holo" - check http://developer.android.com/reference/android/R.style.html#Theme_Holo
- // * "Theme_Holo_Light" - (default for API 11-13) check http://developer.android.com/reference/android/R.style.html#Theme_Holo_Light
- // * "Theme_DeviceDefault" - check http://developer.android.com/reference/android/R.style.html#Theme_DeviceDefault
- // * "Theme_DeviceDefault_Light" - (default for API 14+) check http://developer.android.com/reference/android/R.style.html#Theme_DeviceDefault_Light
-
- public String QT_ANDROID_DEFAULT_THEME = null; // sets the default theme.
-
- public ArrayList<String> m_qtLibs = null; // required qt libs
- public int m_displayDensity = -1;
- private ContextWrapper m_context;
- protected ComponentInfo m_contextInfo;
- private Class<?> m_delegateClass;
-
- private static ArrayList<FileOutputStream> m_fileOutputStreams = new ArrayList<FileOutputStream>();
- // List of open file streams associated with files copied during installation.
-
- QtLoader(ContextWrapper context, Class<?> clazz) {
- m_context = context;
- m_delegateClass = clazz;
- }
-
- // Implement in subclass
- protected void finish() {}
-
- protected String getTitle() {
- return "Qt";
- }
-
- protected void runOnUiThread(Runnable run) {
- run.run();
- }
-
- protected abstract String loaderClassName();
- protected abstract Class<?> contextClassName();
-
- Intent getIntent()
- {
- return null;
- }
- // Implement in subclass
-
- private final List<String> supportedAbis = Arrays.asList(Build.SUPPORTED_ABIS);
- private String preferredAbi = null;
-
- private ArrayList<String> prefferedAbiLibs(String []libs)
- {
- HashMap<String, ArrayList<String>> abisLibs = new HashMap<>();
- for (String lib : libs) {
- String[] archLib = lib.split(";", 2);
- if (preferredAbi != null && !archLib[0].equals(preferredAbi))
- continue;
- if (!abisLibs.containsKey(archLib[0]))
- abisLibs.put(archLib[0], new ArrayList<String>());
- abisLibs.get(archLib[0]).add(archLib[1]);
- }
-
- if (preferredAbi != null) {
- if (abisLibs.containsKey(preferredAbi)) {
- return abisLibs.get(preferredAbi);
- }
- return new ArrayList<String>();
- }
-
- for (String abi: supportedAbis) {
- if (abisLibs.containsKey(abi)) {
- preferredAbi = abi;
- return abisLibs.get(abi);
- }
- }
- return new ArrayList<String>();
- }
-
- // this function is used to load and start the loader
- private void loadApplication(Bundle loaderParams)
- {
- final Resources resources = m_context.getResources();
- final String packageName = m_context.getPackageName();
- try {
- final int errorCode = loaderParams.getInt(ERROR_CODE_KEY);
- if (errorCode != 0) {
- // fatal error, show the error and quit
- AlertDialog errorDialog = new AlertDialog.Builder(m_context).create();
- errorDialog.setMessage(loaderParams.getString(ERROR_MESSAGE_KEY));
- errorDialog.setButton(Dialog.BUTTON_POSITIVE,
- resources.getString(android.R.string.ok),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
- errorDialog.show();
- return;
- }
-
- // add all bundled Qt libs to loader params
- int id = resources.getIdentifier("bundled_libs", "array", packageName);
- final String[] bundledLibs = resources.getStringArray(id);
- ArrayList<String> libs = new ArrayList<>(prefferedAbiLibs(bundledLibs));
-
- String libName = null;
- if (m_contextInfo.metaData.containsKey("android.app.lib_name")) {
- libName = m_contextInfo.metaData.getString("android.app.lib_name") + "_" + preferredAbi;
- loaderParams.putString(MAIN_LIBRARY_KEY, libName); //main library contains main() function
- }
-
- loaderParams.putStringArrayList(BUNDLED_LIBRARIES_KEY, libs);
-
- // load and start QtLoader class
- DexClassLoader classLoader = new DexClassLoader(loaderParams.getString(DEX_PATH_KEY), // .jar/.apk files
- m_context.getDir("outdex", Context.MODE_PRIVATE).getAbsolutePath(), // directory where optimized DEX files should be written.
- loaderParams.containsKey(LIB_PATH_KEY) ? loaderParams.getString(LIB_PATH_KEY) : null, // libs folder (if exists)
- m_context.getClassLoader()); // parent loader
-
- Class<?> loaderClass = classLoader.loadClass(loaderParams.getString(LOADER_CLASS_NAME_KEY)); // load QtLoader class
- Object qtLoader = loaderClass.newInstance(); // create an instance
- Method prepareAppMethod = qtLoader.getClass().getMethod("loadApplication",
- contextClassName(),
- ClassLoader.class,
- Bundle.class);
- if (!(Boolean)prepareAppMethod.invoke(qtLoader, m_context, classLoader, loaderParams))
- throw new Exception("");
-
- QtApplication.setQtContextDelegate(m_delegateClass, qtLoader);
-
- Method startAppMethod=qtLoader.getClass().getMethod("startApplication");
- if (!(Boolean)startAppMethod.invoke(qtLoader))
- throw new Exception("");
-
- } catch (Exception e) {
- e.printStackTrace();
- AlertDialog errorDialog = new AlertDialog.Builder(m_context).create();
- int id = resources.getIdentifier("fatal_error_msg", "string",
- packageName);
- errorDialog.setMessage(resources.getString(id));
- errorDialog.setButton(Dialog.BUTTON_POSITIVE,
- resources.getString(android.R.string.ok),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
- errorDialog.show();
- }
- }
-
- public void startApp(final boolean firstStart)
- {
- try {
- final Resources resources = m_context.getResources();
- final String packageName = m_context.getPackageName();
- int id = resources.getIdentifier("qt_libs", "array", packageName);
- m_qtLibs = prefferedAbiLibs(resources.getStringArray(id));
-
- id = resources.getIdentifier("use_local_qt_libs", "string", packageName);
- final int useLocalLibs = Integer.parseInt(resources.getString(id));
-
- if (useLocalLibs == 1) {
- ArrayList<String> libraryList = new ArrayList<>();
- String libsDir = null;
- String bundledLibsDir = null;
-
- id = resources.getIdentifier("bundle_local_qt_libs", "string", packageName);
- final int bundleLocalLibs = Integer.parseInt(resources.getString(id));
- if (bundleLocalLibs == 0) {
- String systemLibsPrefix;
- final String systemLibsKey = "android.app.system_libs_prefix";
- // First check if user has provided system libs prefix in AndroidManifest
- if (m_contextInfo.applicationInfo.metaData != null &&
- m_contextInfo.applicationInfo.metaData.containsKey(systemLibsKey)) {
- systemLibsPrefix = m_contextInfo.applicationInfo.metaData.getString(systemLibsKey);
- } else {
- // If not, check if it's provided by androiddeployqt in libs.xml
- id = resources.getIdentifier("system_libs_prefix","string",
- packageName);
- systemLibsPrefix = resources.getString(id);
- }
- if (systemLibsPrefix.isEmpty()) {
- systemLibsPrefix = SYSTEM_LIB_PATH;
- Log.e(QtApplication.QtTAG, "It looks like app deployed using Unbundled "
- + "deployment. It may be necessary to specify path to directory "
- + "where Qt libraries are installed using either "
- + "android.app.system_libs_prefix metadata variable in your "
- + "AndroidManifest.xml or QT_ANDROID_SYSTEM_LIBS_PATH in your "
- + "CMakeLists.txt");
- Log.e(QtApplication.QtTAG, "Using " + SYSTEM_LIB_PATH + " as default path");
- }
-
- File systemLibraryDir = new File(systemLibsPrefix);
- if (systemLibraryDir.exists() && systemLibraryDir.isDirectory()
- && systemLibraryDir.list().length > 0) {
- libsDir = systemLibsPrefix;
- bundledLibsDir = systemLibsPrefix;
- } else {
- Log.e(QtApplication.QtTAG,
- "System library directory " + systemLibsPrefix
- + " does not exist or is empty.");
- }
- } else {
- String nativeLibraryPrefix = m_context.getApplicationInfo().nativeLibraryDir + "/";
- File nativeLibraryDir = new File(nativeLibraryPrefix);
- if (nativeLibraryDir.exists() && nativeLibraryDir.isDirectory() && nativeLibraryDir.list().length > 0) {
- libsDir = nativeLibraryPrefix;
- bundledLibsDir = nativeLibraryPrefix;
- } else {
- Log.e(QtApplication.QtTAG,
- "Native library directory " + nativeLibraryPrefix
- + " does not exist or is empty.");
- }
- }
-
- if (libsDir == null)
- throw new Exception("");
-
-
- if (m_qtLibs != null) {
- String libPrefix = libsDir + "lib";
- for (String lib : m_qtLibs)
- libraryList.add(libPrefix + lib + ".so");
- }
-
- id = resources.getIdentifier("load_local_libs", "array", packageName);
- ArrayList<String> localLibs = prefferedAbiLibs(resources.getStringArray(id));
- for (String libs : localLibs) {
- for (String lib : libs.split(":")) {
- if (!lib.isEmpty())
- libraryList.add(libsDir + lib);
- }
- }
- if (bundledLibsDir != null) {
- ENVIRONMENT_VARIABLES += "\tQT_PLUGIN_PATH=" + bundledLibsDir;
- ENVIRONMENT_VARIABLES += "\tQML_PLUGIN_PATH=" + bundledLibsDir;
- }
-
- Bundle loaderParams = new Bundle();
- loaderParams.putInt(ERROR_CODE_KEY, 0);
- loaderParams.putString(DEX_PATH_KEY, new String());
- loaderParams.putString(LOADER_CLASS_NAME_KEY, loaderClassName());
-
- id = resources.getIdentifier("static_init_classes", "string", packageName);
- loaderParams.putStringArray(STATIC_INIT_CLASSES_KEY, resources.getString(id)
- .split(":"));
-
- loaderParams.putStringArrayList(NATIVE_LIBRARIES_KEY, libraryList);
-
-
- String themePath = m_context.getApplicationInfo().dataDir + "/qt-reserved-files/android-style/";
- String stylePath = themePath + m_displayDensity + "/";
-
- String extractOption = "default";
- if (m_contextInfo.metaData.containsKey("android.app.extract_android_style")) {
- extractOption = m_contextInfo.metaData.getString("android.app.extract_android_style");
- if (!extractOption.equals("default") && !extractOption.equals("full") && !extractOption.equals("minimal") && !extractOption.equals("none")) {
- Log.e(QtApplication.QtTAG, "Invalid extract_android_style option \"" + extractOption + "\", defaulting to \"default\"");
- extractOption = "default";
- }
- }
-
- // QTBUG-69810: The extraction code will trigger compatibility warnings on Android SDK version >= 28
- // when the target SDK version is set to something lower then 28, so default to "none" and issue a warning
- // if that is the case.
- if (extractOption.equals("default")) {
- final int targetSdkVersion = m_context.getApplicationInfo().targetSdkVersion;
- if (targetSdkVersion < 28 && Build.VERSION.SDK_INT >= 28) {
- Log.e(QtApplication.QtTAG, "extract_android_style option set to \"none\" when targetSdkVersion is less then 28");
- extractOption = "none";
- }
- }
-
- if (!extractOption.equals("none")) {
- loaderParams.putString(EXTRACT_STYLE_KEY, stylePath);
- loaderParams.putBoolean(EXTRACT_STYLE_MINIMAL_KEY, extractOption.equals("minimal"));
- }
-
- if (extractOption.equals("full"))
- ENVIRONMENT_VARIABLES += "\tQT_USE_ANDROID_NATIVE_STYLE=1";
-
- ENVIRONMENT_VARIABLES += "\tANDROID_STYLE_PATH=" + stylePath;
-
- if (m_contextInfo.metaData.containsKey("android.app.trace_location")) {
- String loc = m_contextInfo.metaData.getString("android.app.trace_location");
- ENVIRONMENT_VARIABLES += "\tQTRACE_LOCATION="+loc;
- }
-
- loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES);
-
- String appParams = null;
- if (APPLICATION_PARAMETERS != null)
- appParams = APPLICATION_PARAMETERS;
-
- Intent intent = getIntent();
- if (intent != null) {
- String parameters = intent.getStringExtra("applicationArguments");
- if (parameters != null)
- if (appParams == null)
- appParams = parameters;
- else
- appParams += '\t' + parameters;
- }
-
- if (m_contextInfo.metaData.containsKey("android.app.arguments")) {
- String parameters = m_contextInfo.metaData.getString("android.app.arguments");
- if (appParams == null)
- appParams = parameters;
- else
- appParams += '\t' + parameters;
- }
-
- if (appParams != null)
- loaderParams.putString(APPLICATION_PARAMETERS_KEY, appParams);
-
- loadApplication(loaderParams);
- return;
- }
- } catch (Exception e) {
- Log.e(QtApplication.QtTAG, "Can't create main activity", e);
- }
- }
-}
diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtService.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtService.java
index 6a6aa03f2e..9ec9dbb4a0 100644
--- a/src/android/java/src/org/qtproject/qt/android/bindings/QtService.java
+++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtService.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2023 The Qt Company Ltd.
// Copyright (c) 2016, BogDan Vatra <bogdan@kde.org>
// 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
diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java
deleted file mode 100644
index 5511266305..0000000000
--- a/src/android/java/src/org/qtproject/qt/android/bindings/QtServiceLoader.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// Copyright (c) 2016, BogDan Vatra <bogdan@kde.org>
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-
-package org.qtproject.qt.android.bindings;
-
-import android.os.Bundle;
-import android.content.ComponentName;
-import android.content.pm.PackageManager;
-
-public class QtServiceLoader extends QtLoader {
- QtService m_service;
- QtServiceLoader(QtService service) {
- super(service, QtService.class);
- m_service = service;
- }
-
- public void onCreate() {
- try {
- 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) {
- Bundle bundle = null;
- QtApplication.invokeDelegateMethod(QtApplication.onCreate, bundle);
- }
- startApp(true);
- }
-
- @Override
- protected void finish() {
- m_service.stopSelf();
- }
-
- @Override
- protected String loaderClassName() {
- return "org.qtproject.qt.android.QtServiceDelegate";
- }
-
- @Override
- protected Class<?> contextClassName() {
- return android.app.Service.class;
- }
-}