Android Open Source - kirin-for-android Abstract Object Holder From Project Back to project page kirin-for-android .
License The source code is released under:
Apache License
If you think the Android project kirin-for-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
Java Source Code package com.futureplatforms.kirin.internal.core;
/ * f r o m w w w . j a v a 2 s . c o m * /
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import android.text.TextUtils;
import android.util.Log;
import com.futureplatforms.kirin.C;
import com.futureplatforms.kirin.internal.attic.ProxyGenerator;
public abstract class AbstractObjectHolder implements IObjectHolder {
private static final class JavaMethodCall implements Runnable {
private final Method mMethod;
private final Object[] mArgs;
private final Object mNativeObject;
private final ProxyGenerator mProxyGenerator;
private JavaMethodCall(Object object, Method method, Object[] args, ProxyGenerator generator) {
mMethod = method;
mArgs = args;
mNativeObject = object;
mProxyGenerator = generator;
}
@Override
public void run() {
try {
Class<?>[] argTypes = null;
for (int i=0, max=mArgs.length; i<max; i++) {
if (mArgs[i] instanceof JSONObject) {
if (argTypes == null) {
// do this only once.
argTypes = mMethod.getParameterTypes();
}
if (argTypes[i].isInterface()) {
mArgs[i] = mProxyGenerator.javascriptProxyForRequest((JSONObject) mArgs[i], argTypes[i]);
}
}
}
mMethod.invoke(mNativeObject, mArgs);
} catch (InvocationTargetException ex) {
Throwable e = ex.getTargetException();
reportException(e);
} catch (Exception e) {
reportException(e);
}
}
private void reportException(Throwable e) {
String[] classes = new String[mArgs.length];
for (int i = 0; i < mArgs.length; i++) {
classes[i] = mArgs[i].getClass().getName();
}
Log.e(C.TAG, "Problem calling " + mNativeObject.getClass().getSimpleName() + "."
+ mMethod.getName() + "(" + TextUtils.join(", " , mMethod.getParameterTypes()) + ");" );
Log.d(C.TAG, "\tJSON arg types : " + Arrays.toString(classes));
Log.d(C.TAG, "\tActual values : " + Arrays.toString(mArgs));
Log.e(C.TAG, "Stacktrace:" , e);
}
}
private boolean mIsInitialized;
private Map<String, Method> mMethodMap;
protected final Object mNativeObject;
private final ProxyGenerator mProxyGenerator;
public AbstractObjectHolder(Object nativeObject, ProxyGenerator proxyGenerator) {
mNativeObject = nativeObject;
mProxyGenerator = proxyGenerator;
}
@Override
public Collection<String> getMethodNames() {
ensureInitialized();
return mMethodMap.keySet();
}
private void ensureInitialized() {
// TODO does this need locks around it?
if (!mIsInitialized) {
calculateMethods();
mIsInitialized = true;
}
}
private void calculateMethods() {
mMethodMap = new HashMap<String, Method>();
Class<?> clazz = mNativeObject.getClass();
for (Method method : clazz.getMethods()) {
String className = method.getDeclaringClass().getName();
if (!className.startsWith("android." ) && !className.startsWith("java" )) {
String name = method.getName();
if (mMethodMap.containsKey(name)) {
Log.w(C.TAG, "More than one " + name + " name declared on " + clazz + ". Behaviour is undefined." );
}
mMethodMap.put(name, method);
}
}
}
protected abstract void enqueue(Runnable methodCall);
@Override
public void invoke(final String methodName, final Object... args) {
ensureInitialized();
final Method method = mMethodMap.get(methodName);
if (method == null) {
Log.e(C.TAG, MessageFormat.format("Can''t invoke {0} on {1}" , methodName, mNativeObject));
return ;
}
enqueue(new JavaMethodCall(mNativeObject, method, args, mProxyGenerator));
}
}
Java Source Code List com.futureplatforms.kirin.C.java com.futureplatforms.kirin.Kirin.java com.futureplatforms.kirin.TestingApplication.java com.futureplatforms.kirin.activities.KirinActivity.java com.futureplatforms.kirin.activities.KirinListActivity.java com.futureplatforms.kirin.application.IKirinApplication.java com.futureplatforms.kirin.application.KirinApplication.java com.futureplatforms.kirin.extensions.IKirinExtensionOnNonDefaultThread.java com.futureplatforms.kirin.extensions.IKirinExtensionOnUiThread.java com.futureplatforms.kirin.extensions.IKirinExtension.java com.futureplatforms.kirin.extensions.IProguardImmunity.java com.futureplatforms.kirin.extensions.KirinExtensionAdapter.java com.futureplatforms.kirin.extensions.KirinExtensions.java com.futureplatforms.kirin.extensions.databases.DBStatement.java com.futureplatforms.kirin.extensions.databases.DBTransaction.java com.futureplatforms.kirin.extensions.databases.DatabasesBackend.java com.futureplatforms.kirin.extensions.databases.IDatabasesBackend.java com.futureplatforms.kirin.extensions.fs.KirinFilesystemExtensionImpl.java com.futureplatforms.kirin.extensions.localnotifications.ILocalNotificationsBackend.java com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationAlarmReceiver.java com.futureplatforms.kirin.extensions.localnotifications.LocalNotificationsBackend.java com.futureplatforms.kirin.extensions.networking.INetworkingBackend.java com.futureplatforms.kirin.extensions.networking.KirinXHRExtensionImpl.java com.futureplatforms.kirin.extensions.networking.NetworkingBackend.java com.futureplatforms.kirin.extensions.settings.ISettingsBackend.java com.futureplatforms.kirin.extensions.settings.PreferencesBackendImpl.java com.futureplatforms.kirin.extensions.settings.SettingsBackend.java com.futureplatforms.kirin.generated.fs.KirinCallback.java com.futureplatforms.kirin.generated.fs.KirinFile.java com.futureplatforms.kirin.generated.fs.KirinFilesystemExtension.java com.futureplatforms.kirin.generated.fs.KirinFilesystem.java com.futureplatforms.kirin.generated.fs.KirinFoundFile.java com.futureplatforms.kirin.generated.fs.KirinOptionalCallback.java com.futureplatforms.kirin.generated.location.KirinLocationBackend.java com.futureplatforms.kirin.generated.location.KirinLocationData.java com.futureplatforms.kirin.generated.location.KirinLocationListener.java com.futureplatforms.kirin.generated.location.KirinLocationPermissions.java com.futureplatforms.kirin.generated.location.KirinLocation.java com.futureplatforms.kirin.generated.preferences.KirinPreferenceListener.java com.futureplatforms.kirin.generated.preferences.KirinPreferencesBackend.java com.futureplatforms.kirin.generated.preferences.KirinPreferences.java com.futureplatforms.kirin.generated.xhr.KirinXHRExtension.java com.futureplatforms.kirin.generated.xhr.KirinXHRProgressEvent.java com.futureplatforms.kirin.generated.xhr.KirinXHRResponse.java com.futureplatforms.kirin.generated.xhr.KirinXHRequest.java com.futureplatforms.kirin.generated.xhr.KirinXMLHTTPRequest.java com.futureplatforms.kirin.helpers.IKirinExtensionHelper.java com.futureplatforms.kirin.helpers.IKirinHelper.java com.futureplatforms.kirin.helpers.KirinApplicationHelper.java com.futureplatforms.kirin.helpers.KirinExtensionHelper.java com.futureplatforms.kirin.helpers.KirinHelper.java com.futureplatforms.kirin.helpers.KirinScreenHelper.java com.futureplatforms.kirin.helpers.KirinUiFragmentHelper.java com.futureplatforms.kirin.internal.JSONUtils.java com.futureplatforms.kirin.internal.KirinPaths.java com.futureplatforms.kirin.internal.attic.IOUtils.java com.futureplatforms.kirin.internal.attic.KirinDropbox.java com.futureplatforms.kirin.internal.attic.ProxyGenerator.java com.futureplatforms.kirin.internal.attic.SDCardFileUtils.java com.futureplatforms.kirin.internal.core.AbstractObjectHolder.java com.futureplatforms.kirin.internal.core.DefaultObjectHandler.java com.futureplatforms.kirin.internal.core.IJsContext.java com.futureplatforms.kirin.internal.core.IKirinState.java com.futureplatforms.kirin.internal.core.INativeContext.java com.futureplatforms.kirin.internal.core.IObjectHolder.java com.futureplatforms.kirin.internal.core.JsCommands.java com.futureplatforms.kirin.internal.core.KirinAppState.java com.futureplatforms.kirin.internal.core.KirinWebViewHolder.java com.futureplatforms.kirin.internal.core.NativeContext.java com.futureplatforms.kirin.internal.core.UiObjectHolder.java com.futureplatforms.kirin.internal.fragmentation.CursorCoercer4.java com.futureplatforms.kirin.internal.fragmentation.CursorCoercer5.java com.futureplatforms.kirin.internal.fragmentation.CursorCoercer.java com.futureplatforms.kirin.internal.fragmentation.WebChromeClient7.java com.futureplatforms.kirin.internal.fragmentation.WebChromeClient8.java com.futureplatforms.kirin.state.IKirinDropbox.java com.futureplatforms.kirin.state.IKirinFileSystem.java com.futureplatforms.kirin.ui.DebugMenuActions.java com.futureplatforms.kirin.ui.JSListAdapter.java com.futureplatforms.kirin.ui.JSOnClickListener.java com.futureplatforms.kirin.ui.KirinRowRenderer.java