diff options
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt5')
3 files changed, 66 insertions, 2 deletions
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 06ece9d04c..8dc804cce4 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -160,6 +160,12 @@ public class QtActivityDelegate private final int ImhEmailCharactersOnly = 0x200000; private final int ImhUrlCharactersOnly = 0x400000; + // application state + private final int ApplicationSuspended = 0x0; + private final int ApplicationHidden = 0x1; + private final int ApplicationInactive = 0x2; + private final int ApplicationActive = 0x4; + public void resetSoftwareKeyboard() { if (m_imm == null) @@ -310,7 +316,7 @@ public class QtActivityDelegate try { @SuppressWarnings("rawtypes") - Class initClass = classLoader.loadClass(className); + Class<?> initClass = classLoader.loadClass(className); Object staticInitDataObject = initClass.newInstance(); // create an instance Method m = initClass.getMethod("setActivity", Activity.class, Object.class); m.invoke(staticInitDataObject, m_activity, this); @@ -621,6 +627,11 @@ public class QtActivityDelegate m_surface.applicationStarted(true); } + public void onPause() + { + QtNative.updateApplicationState(ApplicationInactive); + } + public void onResume() { // fire all lostActions @@ -631,12 +642,18 @@ public class QtActivityDelegate m_activity.runOnUiThread(itr.next()); if (m_started) { + QtNative.updateApplicationState(ApplicationActive); QtNative.clearLostActions(); QtNative.updateWindow(); } } } + public void onStop() + { + QtNative.updateApplicationState(ApplicationSuspended); + } + public Object onRetainNonConfigurationInstance() { try { diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 122fc55aad..51f00a73c6 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -582,6 +582,9 @@ public class QtNative public static native void updateWindow(); // window methods + // application methods + public static native void updateApplicationState(int state); + // menu methods public static native boolean onPrepareOptionsMenu(Menu menu); public static native boolean onOptionsItemSelected(int itemId, boolean checked); diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java index 6cc2f1e333..cd0bddf2c8 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java @@ -55,17 +55,23 @@ import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + public class QtSurface extends SurfaceView implements SurfaceHolder.Callback { private Bitmap m_bitmap = null; private boolean m_started = false; private boolean m_usesGL = false; private GestureDetector m_gestureDetector; + private Object m_accessibilityDelegate = null; public QtSurface(Context context, int id) { super(context); - setFocusable(true); + setFocusable(false); + setFocusableInTouchMode(false); + getHolder().addCallback(this); getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU); setId(id); @@ -107,6 +113,44 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback if (m_usesGL) holder.setFormat(PixelFormat.RGBA_8888); + + + // Initialize Accessibility + // The accessibility code depends on android API level 16, so dynamically resolve it + try { + final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate"; + Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName); + Constructor constructor = qtDelegateClass.getConstructor(Class.forName("android.view.View")); + m_accessibilityDelegate = constructor.newInstance(this); + + Class a11yDelegateClass = Class.forName("android.view.View$AccessibilityDelegate"); + Method setDelegateMethod = this.getClass().getMethod("setAccessibilityDelegate", a11yDelegateClass); + setDelegateMethod.invoke(this, m_accessibilityDelegate); + } 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 boolean dispatchHoverEvent(MotionEvent event) { + // Always attempt to dispatch hover events to accessibility first. + if (m_accessibilityDelegate != null) { + try { + Method dispHoverA11y = m_accessibilityDelegate.getClass().getMethod("dispatchHoverEvent", MotionEvent.class); + boolean ret = (Boolean) dispHoverA11y.invoke(m_accessibilityDelegate, event); + if (ret) + return true; + SurfaceView view = (SurfaceView) this; + Method dispHoverView = view.getClass().getMethod("dispatchHoverEvent", MotionEvent.class); + return (Boolean) dispHoverView.invoke(view, event); + } catch (Exception e) { + Log.w("Qt A11y", "EXCEPTION in dispatchHoverEvent for Accessibility: " + e); + } + } + return false; } @Override |