diff options
Diffstat (limited to 'src')
4 files changed, 86 insertions, 47 deletions
diff --git a/src/android/accessibility/jar/jar.pri b/src/android/accessibility/jar/jar.pri index 23b3ff7087..3ae9fed59d 100644 --- a/src/android/accessibility/jar/jar.pri +++ b/src/android/accessibility/jar/jar.pri @@ -4,7 +4,8 @@ API_VERSION = android-16 PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/accessibility -JAVACLASSPATH += $$PWD/src/ +JAVACLASSPATH += $$PWD/src/ \ + $$DESTDIR/QtAndroid-bundled.jar JAVASOURCES += \ $$PATHPREFIX/QtAccessibilityDelegate.java \ $$PATHPREFIX/QtNativeAccessibility.java diff --git a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java b/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java index a4626b9bb1..cc2aba7937 100644 --- a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java +++ b/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java @@ -43,6 +43,7 @@ package org.qtproject.qt5.android.accessibility; import android.accessibilityservice.AccessibilityService; +import android.app.Activity; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; @@ -60,6 +61,8 @@ import android.content.Context; import java.util.LinkedList; import java.util.List; +import org.qtproject.qt5.android.QtActivityDelegate; + public class QtAccessibilityDelegate extends View.AccessibilityDelegate { private static final String TAG = "Qt A11Y"; @@ -72,8 +75,11 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate // Pretend to be an inner class of the QtSurface. private static final String DEFAULT_CLASS_NAME = "$VirtualChild"; - private final View m_view; - private final AccessibilityManager m_manager; + private View m_view = null; + private AccessibilityManager m_manager; + private QtActivityDelegate m_activityDelegate; + private Activity m_activity; + private ViewGroup m_layout; // The accessible object that currently has the "accessibility focus" // usually indicated by a yellow rectangle on screen. @@ -95,17 +101,71 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate } } - public QtAccessibilityDelegate(View host) + public QtAccessibilityDelegate(Activity activity, ViewGroup layout, QtActivityDelegate activityDelegate) { - m_view = host; - m_view.setOnHoverListener(new HoverEventListener()); - m_manager = (AccessibilityManager) host.getContext() - .getSystemService(Context.ACCESSIBILITY_SERVICE); + m_activity = activity; + m_layout = layout; + m_activityDelegate = activityDelegate; + + m_manager = (AccessibilityManager) m_activity.getSystemService(Context.ACCESSIBILITY_SERVICE); + if (m_manager != null) { + AccessibilityManagerListener accServiceListener = new AccessibilityManagerListener(); + if (!m_manager.addAccessibilityStateChangeListener(accServiceListener)) + Log.w("Qt A11y", "Could not register a11y state change listener"); + if (m_manager.isEnabled()) + accServiceListener.onAccessibilityStateChanged(true); + } + // Enable Qt Accessibility so that notifications are enabled QtNativeAccessibility.setActive(true); } + private class AccessibilityManagerListener implements AccessibilityManager.AccessibilityStateChangeListener + { + @Override + public void onAccessibilityStateChanged(boolean enabled) + { + if (enabled) { + // The accessibility code depends on android API level 16, so dynamically resolve it + if (android.os.Build.VERSION.SDK_INT >= 16) { + try { + View view = m_view; + if (view == null) { + view = new View(m_activity); + view.setId(View.NO_ID); + } + + // ### Keep this for debugging for a while. It allows us to visually see that our View + // ### is on top of the surface(s) + // ColorDrawable color = new ColorDrawable(0x80ff8080); //0xAARRGGBB + // view.setBackground(color); + view.setAccessibilityDelegate(QtAccessibilityDelegate.this); + + // if all is fine, add it to the layout + if (m_view == null) { + //m_layout.addAccessibilityView(view); + m_layout.addView(view, m_activityDelegate.getSurfaceCount(), + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + } + m_view = view; + + m_view.setOnHoverListener(new HoverEventListener()); + } catch (Exception e) { + // Unknown exception means something went wrong. + Log.w("Qt A11y", "Unknown exception: " + e.toString()); + } + } + } else { + if (m_view != null) { + m_layout.removeView(m_view); + m_view = null; + } + } + } + } + + @Override public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) { diff --git a/src/android/android.pro b/src/android/android.pro index 55a94a2c06..b17dd15cd4 100644 --- a/src/android/android.pro +++ b/src/android/android.pro @@ -1,2 +1,3 @@ TEMPLATE = subdirs +CONFIG += ordered SUBDIRS = jar java templates accessibility diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index 97a632972b..4d16d7e13f 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -127,7 +127,6 @@ public class QtActivityDelegate private boolean m_quitApp = true; private Process m_debuggerProcess = null; // debugger process private View m_dummyView = null; - private View m_accView = null; private boolean m_keyboardIsVisible = false; public boolean m_backKeyPressedSent = false; private long m_showHideTimeStamp = System.nanoTime(); @@ -804,6 +803,22 @@ public class QtActivityDelegate m_nativeViews = new HashMap<Integer, View>(); m_activity.registerForContextMenu(m_layout); + // Initialize accessibility + try { + final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate"; + Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName); + Constructor constructor = qtDelegateClass.getConstructor(android.app.Activity.class, + android.view.ViewGroup.class, + this.getClass()); + Object accessibilityDelegate = constructor.newInstance(m_activity, m_layout, this); + } catch (ClassNotFoundException e) { + // Class not found is fine since we are compatible with Android API < 16, but the function will + // only be available with that API level. + } catch (Exception e) { + // Unknown exception means something went wrong. + Log.w("Qt A11y", "Unknown exception: " + e.toString()); + } + m_activity.setContentView(m_layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); @@ -1184,44 +1199,6 @@ public class QtActivityDelegate m_layout.addView(surface, surfaceCount); m_surfaces.put(id, surface); - - // Initialize Accessibility - // The accessibility code depends on android API level 16, so dynamically resolve it - if (android.os.Build.VERSION.SDK_INT >= 16) { - if (m_accView == null) { - try { - View accView = new View(m_activity); - accView.setId(View.NO_ID); - - // ### Keep this for debugging for a while. It allows us to visually see that our View - // ### is on top of the surface(s) - // ColorDrawable color = new ColorDrawable(0x80ff8080); //0xAARRGGBB - // accView.setBackground(color); - - final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate"; - Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName); - Constructor constructor = qtDelegateClass.getConstructor(Class.forName("android.view.View")); - Object accessibilityDelegate = constructor.newInstance(accView); - - Class a11yDelegateClass = Class.forName("android.view.View$AccessibilityDelegate"); - Method setDelegateMethod = accView.getClass().getMethod("setAccessibilityDelegate", a11yDelegateClass); - setDelegateMethod.invoke(accView, accessibilityDelegate); - - // if all is fine, add it to the layout - m_layout.addView(accView, surfaceCount + 1, - new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - - m_accView = accView; - } catch (ClassNotFoundException e) { - // Class not found is fine since we are compatible with Android API < 16, but the function will - // only be available with that API level. - } catch (Exception e) { - // Unknown exception means something went wrong. - Log.w("Qt A11y", "Unknown exception: " + e.toString()); - } - } - } - } public void setSurfaceGeometry(int id, int x, int y, int w, int h) { |