package org.apache.cordova.engine.mozilla; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaPreferences; import org.apache.cordova.CordovaResourceApi; import org.apache.cordova.CordovaWebView; import org.apache.cordova.CordovaWebViewEngine; import org.apache.cordova.ICordovaCookieManager; import org.apache.cordova.LOG; import org.apache.cordova.NativeToJsMessageQueue; import org.apache.cordova.PluginEntry; import org.apache.cordova.PluginManager; import org.apache.cordova.PluginResult; import org.apache.cordova.Whitelist; import org.json.JSONException; import org.mozilla.gecko.GeckoView; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.webkit.WebChromeClient.CustomViewCallback; import android.widget.FrameLayout; import android.widget.LinearLayout.LayoutParams; public class CordovaGeckoView extends GeckoView implements CordovaWebViewEngine.EngineView{ private static final String TAG = "MozillaView"; private static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER); //The CordovaInterface, we need to have access to this! private CordovaInterface cordova; private String url; public PluginManager pluginManager; //Geckoview's current browser object! private Browser currentBrowser; private CordovaGeckoViewChrome chrome; private CordovaGeckoViewContent content; private int loadUrlTimeout; private CordovaResourceApi resourceApi; private long lastMenuEventTime; private HashSet<Integer> boundKeyCodes = new HashSet<Integer>(); private CordovaGeckoViewEngine parentEngine; public CordovaGeckoView(Context context) { super(context); } public CordovaGeckoView(Context context, AttributeSet attributeSet) { super(context, attributeSet); } public CordovaGeckoView(CordovaGeckoViewEngine cordovaGeckoViewEngine) { super(cordovaGeckoViewEngine.mCtx); parentEngine = cordovaGeckoViewEngine; } // Package visibility to enforce that only SystemWebViewEngine should call this method. void init(CordovaGeckoViewEngine parentEngine, CordovaInterface cordova) { this.cordova = cordova; this.parentEngine = parentEngine; this.pluginManager = parentEngine.pluginManager; //Load the mozilla JS bridge importScript("resource://android/assets/www/bridge/mozilla.js"); } /** * Check configuration parameters from Config. * Approved list of URLs that can be loaded into Cordova * <access origin="http://server regexp" subdomains="true" /> * Log level: ERROR, WARN, INFO, DEBUG, VERBOSE (default=ERROR) * <log level="DEBUG" /> */ void loadConfiguration() { if ("true".equals(this.getProperty("Fullscreen", "false"))) { this.cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); this.cordova.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } } /** * Get string property for activity. * * @param name * @param defaultValue * @return the String value for the named property */ public String getProperty(String name, String defaultValue) { Bundle bundle = this.cordova.getActivity().getIntent().getExtras(); if (bundle == null) { return defaultValue; } name = name.toLowerCase(Locale.getDefault()); Object p = bundle.get(name); if (p == null) { return defaultValue; } return p.toString(); } @Override public void setId(int i) { super.setId(i); } @Override public void setVisibility(int invisible) { super.setVisibility(invisible); } /* * (non-Javadoc) * @see org.apache.cordova.CordovaWebView#loadUrl(java.lang.String) */ public void loadUrl(String url) { if(chrome != null) { currentBrowser = this.getCurrentBrowser(); if(currentBrowser != null) { currentBrowser.loadUrl(url); } } } /** * Load the url into the webview. * * @param url */ public void loadUrlIntoView(final String url, boolean recreatePlugins) { LOG.d(TAG, ">>> loadUrl(" + url + ")"); if (recreatePlugins) { this.url = url; this.pluginManager.init(); } loadUrl(url); } public boolean canGoBack() { currentBrowser = this.getCurrentBrowser(); if(currentBrowser != null) { return currentBrowser.canGoBack(); } return false; } public boolean backHistory() { currentBrowser = this.getCurrentBrowser(); if(currentBrowser != null) { boolean returnValue = currentBrowser.canGoBack(); if(returnValue) { currentBrowser.goBack(); } return returnValue; } else return false; } public void handleResume(boolean keepRunning, boolean activityResultKeepRunning) { // TODO Auto-generated method stub } public void showWebPage(String errorUrl, boolean b, boolean c, HashMap<String, Object> params) { // TODO Auto-generated method stub } @Override public View getFocusedChild() { // TODO Auto-generated method stub return null; } @Override public int getVisibility() { return super.getVisibility(); } @Override public void setOverScrollMode(int overScrollNever) { super.setOverScrollMode(overScrollNever); } public CordovaResourceApi getResourceApi() { return resourceApi; } public void sendPluginResult(PluginResult cr, String callbackId) { chrome.addPluginResult(cr, callbackId); } public PluginManager getPluginManager() { // TODO Auto-generated method stub return pluginManager; } public View getView() { return this; } public String getUrl() { // TODO Auto-generated method stub return null; } private boolean startOfHistory() { //Figure out if we're at the start of GeckoView's history, and return currentBrowser = this.getCurrentBrowser(); if(currentBrowser != null) return !currentBrowser.canGoBack(); else return true; } @Override public CordovaWebView getCordovaWebView() { return parentEngine != null ? parentEngine.getCordovaWebView() : null; } }