diff --git a/example/index.html b/example/index.html index a32ae9d5..59f0da52 100644 --- a/example/index.html +++ b/example/index.html @@ -5,7 +5,7 @@ PhoneGap - + diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml index 53d7afb5..5b813bce 100644 --- a/framework/AndroidManifest.xml +++ b/framework/AndroidManifest.xml @@ -37,8 +37,11 @@ + + + + - - + diff --git a/framework/assets/www/index.html b/framework/assets/www/index.html index ff45efc3..69cd9963 100644 --- a/framework/assets/www/index.html +++ b/framework/assets/www/index.html @@ -1,7 +1,7 @@ - + diff --git a/framework/src/com/phonegap/App.java b/framework/src/com/phonegap/App.java index cb3342bc..13aaaee5 100755 --- a/framework/src/com/phonegap/App.java +++ b/framework/src/com/phonegap/App.java @@ -12,6 +12,7 @@ import org.json.JSONException; import org.json.JSONObject; import com.phonegap.api.Plugin; import com.phonegap.api.PluginResult; +import java.util.HashMap; /** * This class exposes methods in DroidGap that can be called from JavaScript. @@ -83,8 +84,11 @@ public class App extends Plugin { public void loadUrl(String url, JSONObject props) throws JSONException { System.out.println("App.loadUrl("+url+","+props+")"); int wait = 0; - + boolean usePhoneGap = true; + boolean clearPrev = false; + // If there are properties, then set them on the Activity + HashMap params = new HashMap(); if (props != null) { JSONArray keys = props.names(); for (int i=0; i 0) { - ((DroidGap)this.ctx).loadUrl(url, wait); - } - else { - ((DroidGap)this.ctx).loadUrl(url); + try { + synchronized(this) { + this.wait(wait); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } } + ((DroidGap)this.ctx).showWebPage(url, usePhoneGap, clearPrev, params); } /** diff --git a/framework/src/com/phonegap/Device.java b/framework/src/com/phonegap/Device.java index 035058fe..ce69dff1 100755 --- a/framework/src/com/phonegap/Device.java +++ b/framework/src/com/phonegap/Device.java @@ -18,7 +18,7 @@ import android.provider.Settings; public class Device extends Plugin { - public static String phonegapVersion = "0.9.5"; // PhoneGap version + public static String phonegapVersion = "0.9.6"; // PhoneGap version public static String platform = "Android"; // Device OS public static String uuid; // Device UUID diff --git a/framework/src/com/phonegap/DroidGap.java b/framework/src/com/phonegap/DroidGap.java index b1323817..3830722e 100755 --- a/framework/src/com/phonegap/DroidGap.java +++ b/framework/src/com/phonegap/DroidGap.java @@ -7,6 +7,8 @@ */ package com.phonegap; +import java.util.HashMap; +import java.util.Map.Entry; import org.json.JSONArray; import org.json.JSONException; @@ -136,7 +138,7 @@ public class DroidGap extends PhonegapActivity { private String urlFile; // The base of the initial URL for our app - private String baseUrl; + private String baseUrl = null; // Plugin to call when activity result is received protected Plugin activityResultCallback = null; @@ -350,12 +352,14 @@ public class DroidGap extends PhonegapActivity { System.out.println("loadUrl("+url+")"); this.urlFile = this.getUrlFile(url); this.url = url; - int i = url.lastIndexOf('/'); - if (i > 0) { - this.baseUrl = url.substring(0, i); - } - else { - this.baseUrl = this.url; + if (this.baseUrl == null) { + int i = url.lastIndexOf('/'); + if (i > 0) { + this.baseUrl = url.substring(0, i+1); + } + else { + this.baseUrl = this.url + "/"; + } } System.out.println("url="+url+" baseUrl="+baseUrl); @@ -738,6 +742,59 @@ public class DroidGap extends PhonegapActivity { int p3 = (p1 < p2) ? p1 : p2; return url.substring(0, p3); } + + /** + * Display a new browser with the specified URL. + * + * NOTE: If usePhoneGap is set, only trusted PhoneGap URLs should be loaded, + * since any PhoneGap API can be called by the loaded HTML page. + * + * @param url The url to load. + * @param usePhoneGap Load url in PhoneGap webview. + * @param clearPrev Clear the activity stack, so new app becomes top of stack + * @param params DroidGap parameters for new app + * @throws android.content.ActivityNotFoundException + */ + public void showWebPage(String url, boolean usePhoneGap, boolean clearPrev, HashMap params) throws android.content.ActivityNotFoundException { + Intent intent = null; + if (usePhoneGap) { + intent = new Intent().setClass(this, com.phonegap.DroidGap.class); + intent.putExtra("url", url); + + // Add parameters + if (params != null) { + java.util.Set> s = params.entrySet(); + java.util.Iterator> it = s.iterator(); + while(it.hasNext()) { + Entry entry = it.next(); + String key = entry.getKey(); + Object value = entry.getValue(); + if (value == null) { + } + else if (value.getClass().equals(String.class)) { + intent.putExtra(key, (String)value); + } + else if (value.getClass().equals(Boolean.class)) { + intent.putExtra(key, (Boolean)value); + } + else if (value.getClass().equals(Integer.class)) { + intent.putExtra(key, (Integer)value); + } + } + + } + } + else { + intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + } + this.startActivity(intent); + + // Finish current activity + if (clearPrev) { + this.finish(); + } + } /** * Provides a hook for calling "alert" from javascript. Useful for @@ -825,8 +882,11 @@ public class DroidGap extends PhonegapActivity { */ @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { + + // Security check to make sure any requests are coming from the page initially + // loaded in webview and not another loaded in an iframe. boolean reqOk = false; - if (this.ctx.urlFile.equals(this.ctx.getUrlFile(url))) { + if (url.indexOf(this.ctx.baseUrl) == 0) { reqOk = true; } @@ -1069,17 +1129,18 @@ public class DroidGap extends PhonegapActivity { // All else else { - int i = url.lastIndexOf('/'); - String newBaseUrl = url; - if (i > 0) { - newBaseUrl = url.substring(0, i); - } - // If our app or file:, then load into our webview // NOTE: This replaces our app with new URL. When BACK is pressed, // our app is reloaded and restarted. All state is lost. - if (this.ctx.loadInWebView || url.startsWith("file://") || this.ctx.baseUrl.equals(newBaseUrl)) { - this.ctx.appView.loadUrl(url); + if (this.ctx.loadInWebView || url.startsWith("file://") || url.indexOf(this.ctx.baseUrl) == 0) { + try { + HashMap params = new HashMap(); + params.put("loadingDialog", ""); + params.put("hideLoadingDialogOnPageLoad", true); + this.ctx.showWebPage(url, true, false, params); + } catch (android.content.ActivityNotFoundException e) { + System.out.println("Error loading url into DroidGap - "+url+":"+ e.toString()); + } } // If not our application, let default viewer handle