Android Open Source - kirin-for-android Kirin Web View 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;
/ * w w w . j a v a 2 s . c o m * /
import java.text.MessageFormat;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.futureplatforms.kirin.C;
import com.futureplatforms.kirin.internal.fragmentation.WebChromeClient7;
import com.futureplatforms.kirin.internal.fragmentation.WebChromeClient8;
public class KirinWebViewHolder implements IJsContext {
private final WebView mWebView;
private final Context mContext;
private final INativeContext mNativeContext;
private volatile boolean mIsReady = false;
private final Queue<String> mStatementQueue = new ConcurrentLinkedQueue<String>();
public KirinWebViewHolder(Context context, INativeContext nativeContext) {
this (context, null, nativeContext);
}
public KirinWebViewHolder(Context context, WebView webView, INativeContext nativeContext) {
if (webView == null) {
webView = new WebView(context);
}
mNativeContext = nativeContext;
mWebView = webView;
mContext = context;
initWebView(mWebView);
}
@Override
public void js(String js) {
if (C.DEBUGGING_SHOW_NATIVE_TO_JS_CALLS) {
Log.d(C.TAG, "Webview is " + (mIsReady ? "" : "not " ) + "initialized: " + js);
}
execJS(js);
}
private void execJS(String js) {
if (mIsReady) {
mWebView.loadUrl("javascript:" + js);
} else {
mStatementQueue.offer(js);
}
}
@SuppressLint("SetJavaScriptEnabled" )
private void initWebView(WebView webView) {
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
if (C.DEBUGGING_SHOW_NATIVE_TO_JS_CALLS) {
Log.d(C.TAG, "Requested: " + url);
}
super.onLoadResource(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.e(C.TAG, MessageFormat.format("Error {0}: ''{1}'' from {2}" , errorCode, description, failingUrl));
}
@Override
public void onPageFinished(WebView view, String url) {
if (mIsReady) {
return ;
}
super.onPageFinished(view, url);
if (C.DEBUGGING_SHOW_NATIVE_TO_JS_CALLS) {
Log.d(C.TAG, "Finished: " + url);
}
for (String stmt : mStatementQueue) {
if (C.DEBUGGING_SHOW_NATIVE_TO_JS_CALLS) {
Log.d(C.TAG, stmt);
}
mWebView.loadUrl("javascript:" + stmt);
}
mStatementQueue.clear();
mIsReady = true;
}
});
// Allow servers to send specific versions of images.
C.setUserAgentString(webView.getSettings().getUserAgentString() + " / " + mContext.getPackageName());
if (C.DEBUGGING_SHOW_CONSOLE_LOG) {
WebChromeClient client = null;
if (Build.VERSION.SDK_INT >= 8) {
client = new WebChromeClient8();
} else if (Build.VERSION.SDK_INT == 7) {
client = new WebChromeClient7();
} else {
client = new WebChromeClient();
}
if (client != null) {
webView.setWebChromeClient(client);
}
}
webView.addJavascriptInterface(new InjectedObject(), "JavaProxyObject" );
// TODO make this point to something a little less hardcoded.
webView.loadUrl("file:///android_asset/generated-javascript/index.android.html" );
}
public class InjectedObject {
@JavascriptInterface
public void call(String classMethod, String jsonArgs) {
String[] split = classMethod.split("\\." , 2);
assert split.length == 2;
String moduleName = split[0];
String methodName = split[1];
Object[] args = null;
try {
JSONArray array = new JSONArray(jsonArgs);
args = new Object[array.length()];
for (int i = 0, max = array.length(); i < max; i++) {
Object object = array.get(i);
if (object != JSONObject.NULL) {
args[i] = object;
} else {
args[i] = null;
}
}
} catch (JSONException e) {
Log.e(C.JS_TAG, MessageFormat.format("Problem calling {0}.{1}{2}" , moduleName, methodName, jsonArgs));
return ;
}
mNativeContext.executeCommandFromModule(moduleName, methodName, args);
}
public void returnValue(int futureId, String result) {
mNativeContext.setReturnValue((long ) futureId, result);
}
}
}
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