Delegate making WebViewClient and ChromeClient to webview engine.

Revert the change of webview preference name.
This commit is contained in:
Ningxin Hu 2014-04-24 09:41:47 +08:00
parent dbfc292353
commit 7a5405d2ab
3 changed files with 33 additions and 87 deletions

View File

@ -166,7 +166,7 @@ public class AndroidWebView extends WebView implements CordovaWebView {
{ {
Log.d(TAG, "Your activity must implement CordovaInterface to work"); Log.d(TAG, "Your activity must implement CordovaInterface to work");
} }
this.setWebChromeClient((CordovaChromeClient) new AndroidChromeClient(this.cordova, this)); this.setWebChromeClient(this.makeChromeClient());
this.initWebViewClient(this.cordova); this.initWebViewClient(this.cordova);
this.loadConfiguration(); this.loadConfiguration();
this.setup(); this.setup();
@ -190,7 +190,7 @@ public class AndroidWebView extends WebView implements CordovaWebView {
{ {
Log.d(TAG, "Your activity must implement CordovaInterface to work"); Log.d(TAG, "Your activity must implement CordovaInterface to work");
} }
this.setWebChromeClient((CordovaChromeClient) new AndroidChromeClient(this.cordova, this)); this.setWebChromeClient(this.makeChromeClient());
this.loadConfiguration(); this.loadConfiguration();
this.setup(); this.setup();
} }
@ -214,7 +214,7 @@ public class AndroidWebView extends WebView implements CordovaWebView {
{ {
Log.d(TAG, "Your activity must implement CordovaInterface to work"); Log.d(TAG, "Your activity must implement CordovaInterface to work");
} }
this.setWebChromeClient((CordovaChromeClient) new AndroidChromeClient(this.cordova)); this.setWebChromeClient(this.makeChromeClient());
this.initWebViewClient(this.cordova); this.initWebViewClient(this.cordova);
this.loadConfiguration(); this.loadConfiguration();
this.setup(); this.setup();
@ -224,15 +224,7 @@ public class AndroidWebView extends WebView implements CordovaWebView {
* set the WebViewClient, but provide special case handling for IceCreamSandwich. * set the WebViewClient, but provide special case handling for IceCreamSandwich.
*/ */
private void initWebViewClient(CordovaInterface cordova) { private void initWebViewClient(CordovaInterface cordova) {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB || this.setWebViewClient(this.makeWebViewClient());
android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
{
this.setWebViewClient((CordovaWebViewClient) new AndroidWebViewClient(this.cordova, this));
}
else
{
this.setWebViewClient((CordovaWebViewClient) new IceCreamCordovaWebViewClient(this.cordova, this));
}
} }
/** /**
@ -1082,4 +1074,18 @@ public class AndroidWebView extends WebView implements CordovaWebView {
public View getView() { public View getView() {
return this; return this;
} }
@Override
public CordovaWebViewClient makeWebViewClient() {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
return (CordovaWebViewClient) new AndroidWebViewClient(this.cordova, this);
} else {
return (CordovaWebViewClient) new IceCreamCordovaWebViewClient(this.cordova, this);
}
}
@Override
public CordovaChromeClient makeChromeClient() {
return (CordovaChromeClient) new AndroidChromeClient(this.cordova, this);
}
} }

View File

@ -214,7 +214,7 @@ public class CordovaActivity extends Activity implements CordovaInterface {
* require a more specialized web view. * require a more specialized web view.
*/ */
protected CordovaWebView makeWebView() { protected CordovaWebView makeWebView() {
String r = this.getStringProperty("webView", "org.apache.cordova.Android").concat("WebView"); String r = this.getStringProperty("webView", "org.apache.cordova.AndroidWebView");
try { try {
Class webViewClass = Class.forName(r); Class webViewClass = Class.forName(r);
@ -222,8 +222,14 @@ public class CordovaActivity extends Activity implements CordovaInterface {
if(CordovaWebView.class.isAssignableFrom(webViewClass)) { if(CordovaWebView.class.isAssignableFrom(webViewClass)) {
CordovaWebView webView = (CordovaWebView) webViewConstructors[0].newInstance(this); for (Constructor<CordovaWebView> constructor : webViewConstructors) {
try {
CordovaWebView webView = (CordovaWebView) constructor.newInstance(this);
return webView; return webView;
} catch (IllegalArgumentException e) {
LOG.e(TAG, "Illegal arguments, try next constructor.");
}
}
} }
else else
{ {
@ -254,44 +260,7 @@ public class CordovaActivity extends Activity implements CordovaInterface {
* @param webView the default constructed web view object * @param webView the default constructed web view object
*/ */
protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) { protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) {
String r = this.getStringProperty("webView", "org.apache.cordova.Android").concat("WebViewClient"); return webView.makeWebViewClient();
try {
Class webViewClientClass = Class.forName(r);
Constructor<CordovaWebViewClient> [] webViewClientConstructors = webViewClientClass.getConstructors();
if(CordovaWebViewClient.class.isAssignableFrom(webViewClientClass)) {
for (Constructor<CordovaWebViewClient> constructor : webViewClientConstructors) {
try {
CordovaWebViewClient webViewClient = (CordovaWebViewClient) constructor.newInstance(this, webView);
return webViewClient;
} catch (IllegalArgumentException e) {
LOG.e(TAG, "Illegal arguments, try next constructor.");
}
}
}
else
{
LOG.e(TAG, "The WebView Engine is NOT a proper WebView, defaulting to system WebView");
}
} catch (ClassNotFoundException e) {
LOG.e(TAG, "The WebView Engine was not found, defaulting to system WebView");
} catch (InstantiationException e) {
LOG.e(TAG, "Unable to instantiate the WebView, defaulting to system WebView");
} catch (IllegalAccessException e) {
LOG.e(TAG, "Illegal Access to Constructor. This should never happen, defaulting to system WebView");
} catch (IllegalArgumentException e) {
LOG.e(TAG, "The WebView does not implement the default constructor, defaulting to system WebView");
} catch (InvocationTargetException e) {
LOG.e(TAG, "Invocation Target Exception! Reflection is hard, defaulting to system WebView");
}
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
return (CordovaWebViewClient) new AndroidWebViewClient(this, webView);
} else {
return (CordovaWebViewClient) new IceCreamCordovaWebViewClient(this, webView);
}
} }
/** /**
@ -303,40 +272,7 @@ public class CordovaActivity extends Activity implements CordovaInterface {
* @param webView the default constructed web view object * @param webView the default constructed web view object
*/ */
protected CordovaChromeClient makeChromeClient(CordovaWebView webView) { protected CordovaChromeClient makeChromeClient(CordovaWebView webView) {
String r = this.getStringProperty("webView", "org.apache.cordova.Android").concat("ChromeClient"); return webView.makeChromeClient();
try {
Class chromeClientClass = Class.forName(r);
Constructor<CordovaChromeClient> [] chromeClientConstructors = chromeClientClass.getConstructors();
if(CordovaChromeClient.class.isAssignableFrom(chromeClientClass)) {
for (Constructor<CordovaChromeClient> constructor : chromeClientConstructors) {
try {
CordovaChromeClient chromeClient = (CordovaChromeClient) constructor.newInstance(this, webView);
return chromeClient;
} catch (IllegalArgumentException e) {
LOG.e(TAG, "Illegal arguments, try next constructor.");
}
}
}
else
{
LOG.e(TAG, "The WebView Engine is NOT a proper WebView, defaulting to system WebView");
}
} catch (ClassNotFoundException e) {
LOG.e(TAG, "The WebView Engine was not found, defaulting to system WebView");
} catch (InstantiationException e) {
LOG.e(TAG, "Unable to instantiate the WebView, defaulting to system WebView");
} catch (IllegalAccessException e) {
LOG.e(TAG, "Illegal Access to Constructor. This should never happen, defaulting to system WebView");
} catch (IllegalArgumentException e) {
LOG.e(TAG, "The WebView does not implement the default constructor, defaulting to system WebView");
} catch (InvocationTargetException e) {
LOG.e(TAG, "Invocation Target Exception! Reflection is hard, defaulting to system WebView");
}
return (CordovaChromeClient) new AndroidChromeClient(this, webView);
} }
/** /**

View File

@ -19,6 +19,10 @@ public interface CordovaWebView {
View getView(); View getView();
CordovaWebViewClient makeWebViewClient();
CordovaChromeClient makeChromeClient();
void setWebViewClient(CordovaWebViewClient webViewClient); void setWebViewClient(CordovaWebViewClient webViewClient);
void setWebChromeClient(CordovaChromeClient webChromeClient); void setWebChromeClient(CordovaChromeClient webChromeClient);