Skip to content

Commit

Permalink
Load new urls in new DroidGap activity - not same webview as initial …
Browse files Browse the repository at this point in the history
…url.
  • Loading branch information
brycecurtis committed Jun 29, 2011
1 parent fc1bea4 commit 1e3422a
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 28 deletions.
7 changes: 5 additions & 2 deletions framework/AndroidManifest.xml
Expand Up @@ -37,8 +37,11 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.phonegap.DroidGap" android:label="@string/app_name">
<intent-filter>
</intent-filter>
</activity>
</application>

<uses-sdk android:minSdkVersion="2" />

<uses-sdk android:minSdkVersion="2" />
</manifest>
35 changes: 25 additions & 10 deletions framework/src/com/phonegap/App.java
Expand Up @@ -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.
Expand Down Expand Up @@ -83,40 +84,54 @@ 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<String, Object> params = new HashMap<String, Object>();
if (props != null) {
JSONArray keys = props.names();
for (int i=0; i<keys.length(); i++) {
String key = keys.getString(i);
if (key.equals("wait")) {
wait = props.getInt(key);
}
else if (key.equalsIgnoreCase("usephonegap")) {
usePhoneGap = props.getBoolean(key);
}
else if (key.equalsIgnoreCase("clearprev")) {
clearPrev = props.getBoolean(key);
}
else {
Object value = props.get(key);
if (value == null) {

}
else if (value.getClass().equals(String.class)) {
this.ctx.getIntent().putExtra(key, (String)value);
params.put(key, (String)value);
}
else if (value.getClass().equals(Boolean.class)) {
this.ctx.getIntent().putExtra(key, (Boolean)value);
params.put(key, (Boolean)value);
}
else if (value.getClass().equals(Integer.class)) {
this.ctx.getIntent().putExtra(key, (Integer)value);
params.put(key, (Integer)value);
}
}
}
}

// If wait property, then delay loading

if (wait > 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);
}

/**
Expand Down
83 changes: 67 additions & 16 deletions framework/src/com/phonegap/DroidGap.java
Expand Up @@ -7,6 +7,8 @@
*/
package com.phonegap;

import java.util.HashMap;
import java.util.Map.Entry;
import org.json.JSONArray;
import org.json.JSONException;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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<String, Object> 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<Entry<String,Object>> s = params.entrySet();
java.util.Iterator<Entry<String,Object>> it = s.iterator();
while(it.hasNext()) {
Entry<String,Object> 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
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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<String, Object> params = new HashMap<String, Object>();
params.put("loadingDialog", "");
params.put("hideLoadingDialogOnPageLoad", true);
this.ctx.showWebPage(url, true, params);
}

// If not our application, let default viewer handle
Expand Down

0 comments on commit 1e3422a

Please sign in to comment.