summaryrefslogtreecommitdiffstats
path: root/src/android/jar/src/org/qtproject
diff options
context:
space:
mode:
authorPetri Virkkunen <petri.virkkunen@qt.io>2024-01-25 14:11:22 +0200
committerPetri Virkkunen <petri.virkkunen@qt.io>2024-02-15 19:44:35 +0200
commit2c192c6f5fe08b014bfa90ea0452258e649d3183 (patch)
tree68401acfd12f02b637536f42ea21b58a92dc9e3d /src/android/jar/src/org/qtproject
parentf4050cc5ea7490ba3b8b2bb0a174559d7e72a27e (diff)
Android: QtActivityDelegateBase listens to focus events from child views
In order to detect gaining/losing and moving focus between windows, implement GlobalFocusChangeListener for the root View. Add a surfaceFocusChanged native function in QAndroidPlatformWindow in order to follow these focus changes. Task-number: QTBUG-118139 Pick-to: 6.7 Change-Id: Ia9bf6249c28a420f42793a9829aef31b12757630 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/android/jar/src/org/qtproject')
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java1
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java20
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java1
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtWindow.java2
4 files changed, 24 insertions, 0 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
index 1fee857a58..25ac59ec32 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java
@@ -138,6 +138,7 @@ class QtActivityDelegate extends QtActivityDelegateBase
r.width(), kbHeight);
return true;
});
+ registerGlobalFocusChangeListener(m_layout);
m_inputDelegate.setEditPopupMenu(new EditPopupMenu(m_activity, m_layout));
}
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java
index 5c36c5fd05..8625c1f601 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java
@@ -133,6 +133,26 @@ abstract class QtActivityDelegateBase
setUpLayout();
}
+ protected void registerGlobalFocusChangeListener(final View view) {
+ view.getViewTreeObserver().addOnGlobalFocusChangeListener(this::onGlobalFocusChanged);
+ }
+
+ private void onGlobalFocusChanged(View oldFocus, View newFocus) {
+ if (newFocus instanceof QtEditText) {
+ final QtWindow newWindow = (QtWindow) newFocus.getParent();
+ QtWindow.windowFocusChanged(true, newWindow.getId());
+ m_inputDelegate.setFocusedView((QtEditText) newFocus);
+ } else {
+ int id = -1;
+ if (oldFocus instanceof QtEditText) {
+ final QtWindow oldWindow = (QtWindow) oldFocus.getParent();
+ id = oldWindow.getId();
+ }
+ QtWindow.windowFocusChanged(false, id);
+ m_inputDelegate.setFocusedView(null);
+ }
+ }
+
public void hideSplashScreen()
{
hideSplashScreen(0);
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java
index cab542622b..66a3f6c949 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java
@@ -135,6 +135,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase implements QtNative.AppS
void setView(QtView view) {
m_view = view;
+ registerGlobalFocusChangeListener(m_view);
}
public void setRootWindowRef(long ref) {
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
index d126ba3dc1..2f8f9cfbdc 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java
@@ -24,6 +24,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface {
private final QtEditText m_editText;
private static native void setSurface(int windowId, Surface surface);
+ static native void windowFocusChanged(boolean hasFocus, int id);
public QtWindow(Context context, QtWindow parentWindow)
{
@@ -31,6 +32,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface {
setId(View.generateViewId());
m_editText = new QtEditText(context);
setParent(parentWindow);
+ setFocusableInTouchMode(true);
QtNative.runAction(() -> {
m_gestureDetector =