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;
/* ww 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