mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-01 01:53:00 +08:00
Experiments with 2.0 and backwards compatibility
This commit is contained in:
parent
706fbdf1f4
commit
34ab64655d
@ -22,7 +22,6 @@ package com.phonegap;
|
|||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@ -38,9 +37,11 @@ import android.view.WindowManager;
|
|||||||
import android.webkit.JsResult;
|
import android.webkit.JsResult;
|
||||||
import android.webkit.WebChromeClient;
|
import android.webkit.WebChromeClient;
|
||||||
import android.webkit.WebSettings;
|
import android.webkit.WebSettings;
|
||||||
|
import android.webkit.WebStorage;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebSettings.LayoutAlgorithm;
|
import android.webkit.WebSettings.LayoutAlgorithm;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
import android.os.Build.*;
|
||||||
|
|
||||||
public class DroidGap extends Activity {
|
public class DroidGap extends Activity {
|
||||||
|
|
||||||
@ -57,6 +58,7 @@ public class DroidGap extends Activity {
|
|||||||
private FileUtils fs;
|
private FileUtils fs;
|
||||||
private NetworkManager netMan;
|
private NetworkManager netMan;
|
||||||
private CompassListener mCompass;
|
private CompassListener mCompass;
|
||||||
|
private WebViewReflect eclairCheck;
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
@Override
|
@Override
|
||||||
@ -81,8 +83,10 @@ public class DroidGap extends Activity {
|
|||||||
appView = new WebView(this);
|
appView = new WebView(this);
|
||||||
appView.setLayoutParams(webviewParams);
|
appView.setLayoutParams(webviewParams);
|
||||||
|
|
||||||
|
WebViewReflect.checkCompatibility();
|
||||||
|
|
||||||
/* This changes the setWebChromeClient to log alerts to LogCat! Important for Javascript Debugging */
|
/* This changes the setWebChromeClient to log alerts to LogCat! Important for Javascript Debugging */
|
||||||
appView.setWebChromeClient(new GapClient(this));
|
appView.setWebChromeClient(new PhoneGapClient(this));
|
||||||
appView.setInitialScale(100);
|
appView.setInitialScale(100);
|
||||||
|
|
||||||
WebSettings settings = appView.getSettings();
|
WebSettings settings = appView.getSettings();
|
||||||
@ -90,13 +94,17 @@ public class DroidGap extends Activity {
|
|||||||
settings.setJavaScriptCanOpenWindowsAutomatically(true);
|
settings.setJavaScriptCanOpenWindowsAutomatically(true);
|
||||||
settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
|
settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
|
||||||
|
|
||||||
|
|
||||||
|
Package pack = this.getClass().getPackage();
|
||||||
|
String appPackage = pack.getName();
|
||||||
|
|
||||||
|
WebViewReflect.setStorage(settings, true, "/data/data/" + appPackage + "/app_database/");
|
||||||
|
|
||||||
/* Bind the appView object to the gap class methods */
|
/* Bind the appView object to the gap class methods */
|
||||||
bindBrowser(appView);
|
bindBrowser(appView);
|
||||||
|
|
||||||
root.addView(appView);
|
root.addView(appView);
|
||||||
setContentView(root);
|
setContentView(root);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -137,29 +145,14 @@ public class DroidGap extends Activity {
|
|||||||
* Provides a hook for calling "alert" from javascript. Useful for
|
* Provides a hook for calling "alert" from javascript. Useful for
|
||||||
* debugging your javascript.
|
* debugging your javascript.
|
||||||
*/
|
*/
|
||||||
final class GapClient extends WebChromeClient {
|
final class PhoneGapClient extends GapClient {
|
||||||
|
|
||||||
Context mCtx;
|
PhoneGapClient(Context ctx){
|
||||||
GapClient(Context ctx)
|
super(ctx);
|
||||||
{
|
|
||||||
mCtx = ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
|
|
||||||
Log.d(LOG_TAG, message);
|
|
||||||
// This shows the dialog box. This can be commented out for dev
|
|
||||||
AlertDialog.Builder alertBldr = new AlertDialog.Builder(mCtx);
|
|
||||||
alertBldr.setMessage(message);
|
|
||||||
alertBldr.setTitle("Alert");
|
|
||||||
alertBldr.show();
|
|
||||||
result.confirm();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// This is required to start the camera activity! It has to come from the previous activity
|
// This is required to start the camera activity! It has to come from the previous activity
|
||||||
public void startCamera(int quality)
|
public void startCamera(int quality)
|
||||||
{
|
{
|
||||||
|
61
framework/src/com/phonegap/GapClient.java
Normal file
61
framework/src/com/phonegap/GapClient.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.webkit.JsResult;
|
||||||
|
import android.webkit.WebChromeClient;
|
||||||
|
import android.webkit.WebStorage;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
|
||||||
|
|
||||||
|
public class GapClient extends WebChromeClient {
|
||||||
|
|
||||||
|
private static final String LOG_TAG = "DroidGap";
|
||||||
|
private long MAX_QUOTA = 2000000;
|
||||||
|
private WebChromeClient mInstance;
|
||||||
|
|
||||||
|
/* class initialization fails when this throws an exception */
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context mCtx;
|
||||||
|
GapClient(Context ctx)
|
||||||
|
{
|
||||||
|
mCtx = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
|
||||||
|
Log.d(LOG_TAG, message);
|
||||||
|
// This shows the dialog box. This can be commented out for dev
|
||||||
|
AlertDialog.Builder alertBldr = new AlertDialog.Builder(mCtx);
|
||||||
|
alertBldr.setMessage(message);
|
||||||
|
alertBldr.setTitle("Alert");
|
||||||
|
alertBldr.show();
|
||||||
|
result.confirm();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize,
|
||||||
|
long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
|
||||||
|
{
|
||||||
|
|
||||||
|
if( estimatedSize < MAX_QUOTA)
|
||||||
|
{
|
||||||
|
long newQuota = estimatedSize;
|
||||||
|
quotaUpdater.updateQuota(newQuota);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Set the quota to whatever it is and force an error
|
||||||
|
// TODO: get docs on how to handle this properly
|
||||||
|
quotaUpdater.updateQuota(currentQuota);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
61
framework/src/com/phonegap/WebViewReflect.java
Normal file
61
framework/src/com/phonegap/WebViewReflect.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package com.phonegap;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import android.webkit.WebSettings;
|
||||||
|
|
||||||
|
public class WebViewReflect {
|
||||||
|
private static Method mWebSettings_setDatabaseEnabled;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
checkCompatibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setDatabaseEnabled(boolean e) throws IOException {
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mWebSettings_setDatabaseEnabled.invoke(e);
|
||||||
|
}
|
||||||
|
catch (InvocationTargetException ite) {
|
||||||
|
/* unpack original exception when possible */
|
||||||
|
Throwable cause = ite.getCause();
|
||||||
|
if (cause instanceof IOException) {
|
||||||
|
throw (IOException) cause;
|
||||||
|
} else if (cause instanceof RuntimeException) {
|
||||||
|
throw (RuntimeException) cause;
|
||||||
|
} else if (cause instanceof Error) {
|
||||||
|
throw (Error) cause;
|
||||||
|
} else {
|
||||||
|
/* unexpected checked exception; wrap and re-throw */
|
||||||
|
throw new RuntimeException(ite);
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException ie) {
|
||||||
|
System.err.println("unexpected " + ie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkCompatibility() {
|
||||||
|
try {
|
||||||
|
mWebSettings_setDatabaseEnabled = WebSettings.class.getMethod(
|
||||||
|
"setDatabaseEnabled", new Class[] { boolean.class } );
|
||||||
|
/* success, this is a newer device */
|
||||||
|
} catch (NoSuchMethodException nsme) {
|
||||||
|
/* failure, must be older device */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void setStorage(WebSettings setting, boolean enable, String path) {
|
||||||
|
if (mWebSettings_setDatabaseEnabled != null) {
|
||||||
|
/* feature is supported */
|
||||||
|
setting.setDatabaseEnabled(enable);
|
||||||
|
setting.setDatabasePath(path);
|
||||||
|
} else {
|
||||||
|
/* feature not supported, do something else */
|
||||||
|
System.out.println("dump not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user