diff --git a/framework/AndroidManifest.xml b/framework/AndroidManifest.xml index 53d7afb59f..5b813bce56 100644 --- a/framework/AndroidManifest.xml +++ b/framework/AndroidManifest.xml @@ -37,8 +37,11 @@ + + + + - - + diff --git a/framework/src/com/phonegap/App.java b/framework/src/com/phonegap/App.java index cb3342bc29..13aaaee5a6 100755 --- a/framework/src/com/phonegap/App.java +++ b/framework/src/com/phonegap/App.java @@ -12,6 +12,7 @@ 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 void clearCache() { 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/DroidGap.java b/framework/src/com/phonegap/DroidGap.java index b132381730..1245d7c5da 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 void loadUrl(final String url) { 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,56 @@ private String getUrlFile(String url) { 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. + * @return "" if ok, or error message. + */ + public void showWebPage(String url, boolean usePhoneGap, HashMap params) { + try { + 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); + } catch (android.content.ActivityNotFoundException e) { + System.out.println("DroidGap.showWebPage: Error loading url "+url+":"+ e.toString()); + } + } /** * Provides a hook for calling "alert" from javascript. Useful for @@ -826,7 +880,7 @@ public void onClick(DialogInterface dialog, int which) { @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { boolean reqOk = false; - if (this.ctx.urlFile.equals(this.ctx.getUrlFile(url))) { + if (url.indexOf(this.ctx.baseUrl) == 0) { reqOk = true; } @@ -1069,17 +1123,14 @@ else if (url.startsWith("sms:")) { // 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) { + HashMap params = new HashMap(); + params.put("loadingDialog", ""); + params.put("hideLoadingDialogOnPageLoad", true); + this.ctx.showWebPage(url, true, params); } // If not our application, let default viewer handle