From e3689949ba5b23decb0ea85741a3f4829696788e Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Tue, 8 Dec 2015 12:43:03 +0200 Subject: Android: Remove support for API < 16 Starting with Qt 5.7 we removed support for API < 16 (Android v4.1) [ChangeLog][Android] Support for Android API < 16 was removed. Change-Id: I8bf396a9d70ab0996965e0c9f629800aa1fa6a45 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/android/accessibility/jar/AndroidManifest.xml | 7 - src/android/accessibility/jar/bundledjar.pro | 3 - src/android/accessibility/jar/distributedjar.pro | 2 - src/android/accessibility/jar/jar.pri | 15 - src/android/accessibility/jar/jar.pro | 2 - .../accessibility/QtAccessibilityDelegate.java | 416 --------------------- .../accessibility/QtNativeAccessibility.java | 52 --- 7 files changed, 497 deletions(-) delete mode 100644 src/android/accessibility/jar/AndroidManifest.xml delete mode 100644 src/android/accessibility/jar/bundledjar.pro delete mode 100644 src/android/accessibility/jar/distributedjar.pro delete mode 100644 src/android/accessibility/jar/jar.pri delete mode 100644 src/android/accessibility/jar/jar.pro delete mode 100644 src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java delete mode 100644 src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java (limited to 'src/android/accessibility/jar') diff --git a/src/android/accessibility/jar/AndroidManifest.xml b/src/android/accessibility/jar/AndroidManifest.xml deleted file mode 100644 index dc8343a55a..0000000000 --- a/src/android/accessibility/jar/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/src/android/accessibility/jar/bundledjar.pro b/src/android/accessibility/jar/bundledjar.pro deleted file mode 100644 index 85ba810310..0000000000 --- a/src/android/accessibility/jar/bundledjar.pro +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = QtAndroidAccessibility-bundled -CONFIG += bundled_jar_file -include(jar.pri) diff --git a/src/android/accessibility/jar/distributedjar.pro b/src/android/accessibility/jar/distributedjar.pro deleted file mode 100644 index d161cf0cf6..0000000000 --- a/src/android/accessibility/jar/distributedjar.pro +++ /dev/null @@ -1,2 +0,0 @@ -TARGET = QtAndroidAccessibility -include(jar.pri) diff --git a/src/android/accessibility/jar/jar.pri b/src/android/accessibility/jar/jar.pri deleted file mode 100644 index 3ae9fed59d..0000000000 --- a/src/android/accessibility/jar/jar.pri +++ /dev/null @@ -1,15 +0,0 @@ -CONFIG += java -DESTDIR = $$[QT_INSTALL_PREFIX/get]/jar -API_VERSION = android-16 - -PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/accessibility - -JAVACLASSPATH += $$PWD/src/ \ - $$DESTDIR/QtAndroid-bundled.jar -JAVASOURCES += \ - $$PATHPREFIX/QtAccessibilityDelegate.java \ - $$PATHPREFIX/QtNativeAccessibility.java - -# install -target.path = $$[QT_INSTALL_PREFIX]/jar -INSTALLS += target \ No newline at end of file diff --git a/src/android/accessibility/jar/jar.pro b/src/android/accessibility/jar/jar.pro deleted file mode 100644 index 8d19c1b7d6..0000000000 --- a/src/android/accessibility/jar/jar.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += bundledjar.pro distributedjar.pro 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 deleted file mode 100644 index 6f95675597..0000000000 --- a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java +++ /dev/null @@ -1,416 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the Android port of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -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; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.text.TextUtils; - -import android.view.accessibility.*; -import android.view.MotionEvent; -import android.view.View.OnHoverListener; - -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"; - - // Qt uses the upper half of the unsiged integers - // all low positive ints should be fine. - public static final int INVALID_ID = 333; // half evil - - // The platform might ask for the class implementing the "view". - // Pretend to be an inner class of the QtSurface. - private static final String DEFAULT_CLASS_NAME = "$VirtualChild"; - - 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. - private int m_focusedVirtualViewId = INVALID_ID; - // When exploring the screen by touch, the item "hovered" by the finger. - private int m_hoveredVirtualViewId = INVALID_ID; - - // Cache coordinates of the view to know the global offset - // this is because the Android platform window does not take - // the offset of the view on screen into account (eg status bar on top) - private final int[] m_globalOffset = new int[2]; - - private class HoverEventListener implements View.OnHoverListener - { - @Override - public boolean onHover(View v, MotionEvent event) - { - return dispatchHoverEvent(event); - } - } - - public QtAccessibilityDelegate(Activity activity, ViewGroup layout, QtActivityDelegate activityDelegate) - { - 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); - } - } - - private class AccessibilityManagerListener implements AccessibilityManager.AccessibilityStateChangeListener - { - @Override - public void onAccessibilityStateChanged(boolean enabled) - { - if (enabled) { - 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; - } - } - - QtNativeAccessibility.setActive(enabled); - } - } - - - @Override - public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) - { - return m_nodeProvider; - } - - // For "explore by touch" we need all movement events here first - // (user moves finger over screen to discover items on screen). - private boolean dispatchHoverEvent(MotionEvent event) - { - if (!m_manager.isTouchExplorationEnabled()) { - return false; - } - - int virtualViewId = QtNativeAccessibility.hitTest(event.getX(), event.getY()); - if (virtualViewId == INVALID_ID) { - virtualViewId = View.NO_ID; - } - - switch (event.getAction()) { - case MotionEvent.ACTION_HOVER_ENTER: - case MotionEvent.ACTION_HOVER_MOVE: - setHoveredVirtualViewId(virtualViewId); - break; - case MotionEvent.ACTION_HOVER_EXIT: - setHoveredVirtualViewId(virtualViewId); - break; - } - - return true; - } - - public boolean sendEventForVirtualViewId(int virtualViewId, int eventType) - { - if ((virtualViewId == INVALID_ID) || !m_manager.isEnabled()) { - Log.w(TAG, "sendEventForVirtualViewId for invalid view"); - return false; - } - - final ViewGroup group = (ViewGroup) m_view.getParent(); - if (group == null) { - Log.w(TAG, "Could not send AccessibilityEvent because group was null. This should really not happen."); - return false; - } - - final AccessibilityEvent event; - event = getEventForVirtualViewId(virtualViewId, eventType); - return group.requestSendAccessibilityEvent(m_view, event); - } - - public void invalidateVirtualViewId(int virtualViewId) - { - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - } - - private void setHoveredVirtualViewId(int virtualViewId) - { - if (m_hoveredVirtualViewId == virtualViewId) { - return; - } - - final int previousVirtualViewId = m_hoveredVirtualViewId; - m_hoveredVirtualViewId = virtualViewId; - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); - sendEventForVirtualViewId(previousVirtualViewId, AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); - } - - private AccessibilityEvent getEventForVirtualViewId(int virtualViewId, int eventType) - { - final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); - - event.setEnabled(true); - event.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME); - - event.setContentDescription(QtNativeAccessibility.descriptionForAccessibleObject(virtualViewId)); - if (event.getText().isEmpty() && TextUtils.isEmpty(event.getContentDescription())) - Log.w(TAG, "AccessibilityEvent with empty description"); - - event.setPackageName(m_view.getContext().getPackageName()); - event.setSource(m_view, virtualViewId); - return event; - } - - private void dumpNodes(int parentId) - { - Log.i(TAG, "A11Y hierarchy: " + parentId + " parent: " + QtNativeAccessibility.parentId(parentId)); - Log.i(TAG, " desc: " + QtNativeAccessibility.descriptionForAccessibleObject(parentId) + " rect: " + QtNativeAccessibility.screenRect(parentId)); - Log.i(TAG, " NODE: " + getNodeForVirtualViewId(parentId)); - int[] ids = QtNativeAccessibility.childIdListForAccessibleObject(parentId); - for (int i = 0; i < ids.length; ++i) { - Log.i(TAG, parentId + " has child: " + ids[i]); - dumpNodes(ids[i]); - } - } - - private AccessibilityNodeInfo getNodeForView() - { - // Since we don't want the parent to be focusable, but we can't remove - // actions from a node, copy over the necessary fields. - final AccessibilityNodeInfo result = AccessibilityNodeInfo.obtain(m_view); - final AccessibilityNodeInfo source = AccessibilityNodeInfo.obtain(m_view); - m_view.onInitializeAccessibilityNodeInfo(source); - - // Get the actual position on screen, taking the status bar into account. - m_view.getLocationOnScreen(m_globalOffset); - final int offsetX = m_globalOffset[0]; - final int offsetY = m_globalOffset[1]; - - // Copy over parent and screen bounds. - final Rect m_tempParentRect = new Rect(); - source.getBoundsInParent(m_tempParentRect); - result.setBoundsInParent(m_tempParentRect); - - final Rect m_tempScreenRect = new Rect(); - source.getBoundsInScreen(m_tempScreenRect); - m_tempScreenRect.offset(offsetX, offsetY); - result.setBoundsInScreen(m_tempScreenRect); - - // Set up the parent view, if applicable. - final ViewParent parent = m_view.getParent(); - if (parent instanceof View) { - result.setParent((View) parent); - } - - result.setVisibleToUser(source.isVisibleToUser()); - result.setPackageName(source.getPackageName()); - result.setClassName(source.getClassName()); - -// Spit out the entire hierarchy for debugging purposes -// dumpNodes(-1); - - int[] ids = QtNativeAccessibility.childIdListForAccessibleObject(-1); - for (int i = 0; i < ids.length; ++i) - result.addChild(m_view, ids[i]); - - return result; - } - - private AccessibilityNodeInfo getNodeForVirtualViewId(int virtualViewId) - { - final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain(); - - node.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME); - node.setPackageName(m_view.getContext().getPackageName()); - - if (!QtNativeAccessibility.populateNode(virtualViewId, node)) - return node; - - // set only if valid, otherwise we return a node that is invalid and will crash when accessed - node.setSource(m_view, virtualViewId); - - if (TextUtils.isEmpty(node.getText()) && TextUtils.isEmpty(node.getContentDescription())) - Log.w(TAG, "AccessibilityNodeInfo with empty contentDescription: " + virtualViewId); - - int parentId = QtNativeAccessibility.parentId(virtualViewId); - node.setParent(m_view, parentId); - - Rect screenRect = QtNativeAccessibility.screenRect(virtualViewId); - final int offsetX = m_globalOffset[0]; - final int offsetY = m_globalOffset[1]; - screenRect.offset(offsetX, offsetY); - node.setBoundsInScreen(screenRect); - - Rect rectInParent = screenRect; - Rect parentScreenRect = QtNativeAccessibility.screenRect(parentId); - rectInParent.offset(-parentScreenRect.left, -parentScreenRect.top); - node.setBoundsInParent(rectInParent); - - // Manage internal accessibility focus state. - if (m_focusedVirtualViewId == virtualViewId) { - node.setAccessibilityFocused(true); - node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS); - } else { - node.setAccessibilityFocused(false); - node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS); - } - - int[] ids = QtNativeAccessibility.childIdListForAccessibleObject(virtualViewId); - for (int i = 0; i < ids.length; ++i) - node.addChild(m_view, ids[i]); - return node; - } - - private AccessibilityNodeProvider m_nodeProvider = new AccessibilityNodeProvider() - { - @Override - public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) - { - if (virtualViewId == View.NO_ID) { - return getNodeForView(); - } - return getNodeForVirtualViewId(virtualViewId); - } - - @Override - public boolean performAction(int virtualViewId, int action, Bundle arguments) - { - boolean handled = false; - //Log.i(TAG, "PERFORM ACTION: " + action + " on " + virtualViewId); - switch (action) { - case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: - // Only handle the FOCUS action if it's placing focus on - // a different view that was previously focused. - if (m_focusedVirtualViewId != virtualViewId) { - m_focusedVirtualViewId = virtualViewId; - m_view.invalidate(); - sendEventForVirtualViewId(virtualViewId, - AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); - handled = true; - } - break; - case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS: - if (m_focusedVirtualViewId == virtualViewId) { - m_focusedVirtualViewId = INVALID_ID; - } - // Since we're managing focus at the parent level, we are - // likely to receive a FOCUS action before a CLEAR_FOCUS - // action. We'll give the benefit of the doubt to the - // framework and always handle FOCUS_CLEARED. - m_view.invalidate(); - sendEventForVirtualViewId(virtualViewId, - AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); - handled = true; - break; - default: - // Let the node provider handle focus for the view node. - if (virtualViewId == View.NO_ID) { - return m_view.performAccessibilityAction(action, arguments); - } - } - handled |= performActionForVirtualViewId(virtualViewId, action, arguments); - - return handled; - } - }; - - protected boolean performActionForVirtualViewId(int virtualViewId, int action, Bundle arguments) - { -// Log.i(TAG, "ACTION " + action + " on " + virtualViewId); -// dumpNodes(virtualViewId); - boolean success = false; - switch (action) { - case AccessibilityNodeInfo.ACTION_CLICK: - success = QtNativeAccessibility.clickAction(virtualViewId); - if (success) - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_VIEW_CLICKED); - break; - case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: - success = QtNativeAccessibility.scrollForward(virtualViewId); - if (success) - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_VIEW_SCROLLED); - break; - case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: - success = QtNativeAccessibility.scrollBackward(virtualViewId); - if (success) - sendEventForVirtualViewId(virtualViewId, AccessibilityEvent.TYPE_VIEW_SCROLLED); - break; - } - return success; - } -} diff --git a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java b/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java deleted file mode 100644 index bfda2d55b7..0000000000 --- a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the Android port of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -package org.qtproject.qt5.android.accessibility; - -import android.graphics.Rect; -import android.view.accessibility.AccessibilityNodeInfo; - -class QtNativeAccessibility -{ - static native void setActive(boolean enable); - static native int[] childIdListForAccessibleObject(int objectId); - static native int parentId(int objectId); - static native String descriptionForAccessibleObject(int objectId); - static native Rect screenRect(int objectId); - static native int hitTest(float x, float y); - static native boolean clickAction(int objectId); - static native boolean scrollForward(int objectId); - static native boolean scrollBackward(int objectId); - - static native boolean populateNode(int objectId, AccessibilityNodeInfo node); -} -- cgit v1.2.3