mirror of https://github.com/PurpleI2P/i2pd
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
6.6 KiB
Java
160 lines
6.6 KiB
Java
/*
|
|
Copyright (c) 2012-2013, BogDan Vatra <bogdan@kde.org>
|
|
Contact: http://www.qt.io/licensing/
|
|
|
|
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.
|
|
|
|
BSD License Usage
|
|
Alternatively, this file may be used under the BSD license as follows:
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
package org.qtproject.qt5.android.bindings;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
|
|
import android.app.Application;
|
|
|
|
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 void setQtActivityDelegate(Object listener)
|
|
{
|
|
QtApplication.m_delegateObject = listener;
|
|
|
|
ArrayList<Method> delegateMethods = new ArrayList<Method>();
|
|
for (Method m : listener.getClass().getMethods()) {
|
|
if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt5.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 {
|
|
QtActivity.class.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));
|
|
super.onTerminate();
|
|
}
|
|
|
|
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) {
|
|
String activityClassName = QtActivity.class.getCanonicalName();
|
|
for (int it=0;it<elements.length;it++)
|
|
if (elements[it].getClassName().equals(activityClassName)) {
|
|
stackDeep = it;
|
|
break;
|
|
}
|
|
}
|
|
final String methodName=elements[stackDeep].getMethodName();
|
|
if (-1 == stackDeep || !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;
|
|
}
|
|
}
|