CallbackProxypublic class CallbackProxy extends android.os.Handler This class is a proxy class for handling WebCore -> UI thread messaging. All
the callback functions are called from the WebCore thread and messages are
posted to the UI thread for the actual client callback. |
Fields Summary |
---|
private static final String | LOGTAG | private volatile WebViewClient | mWebViewClient | private volatile WebChromeClient | mWebChromeClient | private final WebView | mWebView | private volatile DownloadListener | mDownloadListener | private boolean | mProgressUpdatePending | private volatile int | mLatestProgress | private final WebBackForwardList | mBackForwardList | private final android.content.Context | mContext | private static final int | PAGE_STARTED | private static final int | RECEIVED_ICON | private static final int | RECEIVED_TITLE | private static final int | OVERRIDE_URL | private static final int | AUTH_REQUEST | private static final int | SSL_ERROR | private static final int | PROGRESS | private static final int | UPDATE_VISITED | private static final int | LOAD_RESOURCE | private static final int | CREATE_WINDOW | private static final int | CLOSE_WINDOW | private static final int | SAVE_PASSWORD | private static final int | JS_ALERT | private static final int | JS_CONFIRM | private static final int | JS_PROMPT | private static final int | JS_UNLOAD | private static final int | ASYNC_KEYEVENTS | private static final int | TOO_MANY_REDIRECTS | private static final int | DOWNLOAD_FILE | private static final int | REPORT_ERROR | private static final int | RESEND_POST_DATA | private static final int | PAGE_FINISHED | private static final int | REQUEST_FOCUS | private static final int | SCALE_CHANGED | private static final int | RECEIVED_CERTIFICATE | private static final int | SWITCH_OUT_HISTORY | private static final int | NOTIFY | private long | mWebCoreThreadTime |
Constructors Summary |
---|
public CallbackProxy(android.content.Context context, WebView w)Construct a new CallbackProxy.
// Used to start a default activity.
mContext = context;
mWebView = w;
mBackForwardList = new WebBackForwardList();
|
Methods Summary |
---|
public WebView | createWindow(boolean dialog, boolean userGesture)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return null;
}
WebView.WebViewTransport transport = mWebView.new WebViewTransport();
final Message msg = obtainMessage(NOTIFY);
msg.obj = transport;
synchronized (this) {
sendMessage(obtainMessage(CREATE_WINDOW, dialog ? 1 : 0,
userGesture ? 1 : 0, msg));
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG,
"Caught exception while waiting for createWindow");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
WebView w = transport.getWebView();
if (w != null) {
w.getWebViewCore().initializeSubwindow();
}
return w;
| public void | doUpdateVisitedHistory(java.lang.String url, boolean isReload)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
sendMessage(obtainMessage(UPDATE_VISITED, isReload ? 1 : 0, 0, url));
| public WebBackForwardList | getBackForwardList()Get the Back/Forward list to return to the user or to update the cached
history list.
return mBackForwardList;
| private java.lang.String | getJsDialogTitle(java.lang.String url)
String title = url;
if (URLUtil.isDataUrl(url)) {
// For data: urls, we just display 'JavaScript' similar to Safari.
title = mContext.getString(R.string.js_dialog_title_default);
} else {
try {
URL aUrl = new URL(url);
// For example: "The page at 'http://www.mit.edu' says:"
title = mContext.getString(R.string.js_dialog_title,
aUrl.getProtocol() + "://" + aUrl.getHost());
} catch (MalformedURLException ex) {
// do nothing. just use the url as the title
}
}
return title;
| public int | getProgress()Return the latest progress.
return mLatestProgress;
| public void | handleMessage(android.os.Message msg)
// We don't have to do synchronization because this function operates
// in the UI thread. The WebViewClient and WebChromeClient functions
// that check for a non-null callback are ok because java ensures atomic
// 32-bit reads and writes.
switch (msg.what) {
case PAGE_STARTED:
if (mWebViewClient != null) {
mWebViewClient.onPageStarted(mWebView,
msg.getData().getString("url"),
(Bitmap) msg.obj);
}
break;
case PAGE_FINISHED:
if (mWebViewClient != null) {
mWebViewClient.onPageFinished(mWebView, (String) msg.obj);
}
break;
case RECEIVED_ICON:
if (mWebChromeClient != null) {
mWebChromeClient.onReceivedIcon(mWebView, (Bitmap) msg.obj);
}
break;
case RECEIVED_TITLE:
if (mWebChromeClient != null) {
mWebChromeClient.onReceivedTitle(mWebView,
(String) msg.obj);
}
break;
case TOO_MANY_REDIRECTS:
Message cancelMsg =
(Message) msg.getData().getParcelable("cancelMsg");
Message continueMsg =
(Message) msg.getData().getParcelable("continueMsg");
if (mWebViewClient != null) {
mWebViewClient.onTooManyRedirects(mWebView, cancelMsg,
continueMsg);
} else {
cancelMsg.sendToTarget();
}
break;
case REPORT_ERROR:
if (mWebViewClient != null) {
int reasonCode = msg.arg1;
final String description = msg.getData().getString("description");
final String failUrl = msg.getData().getString("failingUrl");
mWebViewClient.onReceivedError(mWebView, reasonCode,
description, failUrl);
}
break;
case RESEND_POST_DATA:
Message resend =
(Message) msg.getData().getParcelable("resend");
Message dontResend =
(Message) msg.getData().getParcelable("dontResend");
if (mWebViewClient != null) {
mWebViewClient.onFormResubmission(mWebView, dontResend,
resend);
} else {
dontResend.sendToTarget();
}
break;
case OVERRIDE_URL:
String overrideUrl = msg.getData().getString("url");
boolean override = uiOverrideUrlLoading(overrideUrl);
ResultTransport<Boolean> result =
(ResultTransport<Boolean>) msg.obj;
synchronized (this) {
result.setResult(override);
notify();
}
break;
case AUTH_REQUEST:
if (mWebViewClient != null) {
HttpAuthHandler handler = (HttpAuthHandler) msg.obj;
String host = msg.getData().getString("host");
String realm = msg.getData().getString("realm");
mWebViewClient.onReceivedHttpAuthRequest(mWebView, handler,
host, realm);
}
break;
case SSL_ERROR:
if (mWebViewClient != null) {
HashMap<String, Object> map =
(HashMap<String, Object>) msg.obj;
mWebViewClient.onReceivedSslError(mWebView,
(SslErrorHandler) map.get("handler"),
(SslError) map.get("error"));
}
break;
case PROGRESS:
// Synchronize to ensure mLatestProgress is not modified after
// setProgress is called and before mProgressUpdatePending is
// changed.
synchronized (this) {
if (mWebChromeClient != null) {
mWebChromeClient.onProgressChanged(mWebView,
mLatestProgress);
}
mProgressUpdatePending = false;
}
break;
case UPDATE_VISITED:
if (mWebViewClient != null) {
mWebViewClient.doUpdateVisitedHistory(mWebView,
(String) msg.obj, msg.arg1 != 0);
}
break;
case LOAD_RESOURCE:
if (mWebViewClient != null) {
mWebViewClient.onLoadResource(mWebView, (String) msg.obj);
}
break;
case DOWNLOAD_FILE:
if (mDownloadListener != null) {
String url = msg.getData().getString("url");
String userAgent = msg.getData().getString("userAgent");
String contentDisposition =
msg.getData().getString("contentDisposition");
String mimetype = msg.getData().getString("mimetype");
Long contentLength = msg.getData().getLong("contentLength");
mDownloadListener.onDownloadStart(url, userAgent,
contentDisposition, mimetype, contentLength);
}
break;
case CREATE_WINDOW:
if (mWebChromeClient != null) {
if (!mWebChromeClient.onCreateWindow(mWebView,
msg.arg1 == 1, msg.arg2 == 1,
(Message) msg.obj)) {
synchronized (this) {
notify();
}
}
}
break;
case REQUEST_FOCUS:
if (mWebChromeClient != null) {
mWebChromeClient.onRequestFocus(mWebView);
}
break;
case CLOSE_WINDOW:
if (mWebChromeClient != null) {
mWebChromeClient.onCloseWindow((WebView) msg.obj);
}
break;
case SAVE_PASSWORD:
Bundle bundle = msg.getData();
String schemePlusHost = bundle.getString("host");
String username = bundle.getString("username");
String password = bundle.getString("password");
// If the client returned false it means that the notify message
// will not be sent and we should notify WebCore ourselves.
if (!mWebView.onSavePassword(schemePlusHost, username, password,
(Message) msg.obj)) {
synchronized (this) {
notify();
}
}
break;
case ASYNC_KEYEVENTS:
if (mWebViewClient != null) {
mWebViewClient.onUnhandledKeyEvent(mWebView,
(KeyEvent) msg.obj);
}
break;
case JS_ALERT:
if (mWebChromeClient != null) {
final JsResult res = (JsResult) msg.obj;
String message = msg.getData().getString("message");
String url = msg.getData().getString("url");
if (!mWebChromeClient.onJsAlert(mWebView, url, message,
res)) {
new AlertDialog.Builder(mContext)
.setTitle(getJsDialogTitle(url))
.setMessage(message)
.setPositiveButton(R.string.ok,
new AlertDialog.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
res.confirm();
}
})
.setCancelable(false)
.show();
}
res.setReady();
}
break;
case JS_CONFIRM:
if (mWebChromeClient != null) {
final JsResult res = (JsResult) msg.obj;
String message = msg.getData().getString("message");
String url = msg.getData().getString("url");
if (!mWebChromeClient.onJsConfirm(mWebView, url, message,
res)) {
new AlertDialog.Builder(mContext)
.setTitle(getJsDialogTitle(url))
.setMessage(message)
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
res.confirm();
}})
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
res.cancel();
}})
.show();
}
// Tell the JsResult that it is ready for client
// interaction.
res.setReady();
}
break;
case JS_PROMPT:
if (mWebChromeClient != null) {
final JsPromptResult res = (JsPromptResult) msg.obj;
String message = msg.getData().getString("message");
String defaultVal = msg.getData().getString("default");
String url = msg.getData().getString("url");
if (!mWebChromeClient.onJsPrompt(mWebView, url, message,
defaultVal, res)) {
final LayoutInflater factory = LayoutInflater
.from(mContext);
final View view = factory.inflate(R.layout.js_prompt,
null);
final EditText v = (EditText) view
.findViewById(R.id.value);
v.setText(defaultVal);
((TextView) view.findViewById(R.id.message))
.setText(message);
new AlertDialog.Builder(mContext)
.setTitle(getJsDialogTitle(url))
.setView(view)
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int whichButton) {
res.confirm(v.getText()
.toString());
}
})
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int whichButton) {
res.cancel();
}
})
.setOnCancelListener(
new DialogInterface.OnCancelListener() {
public void onCancel(
DialogInterface dialog) {
res.cancel();
}
})
.show();
}
// Tell the JsResult that it is ready for client
// interaction.
res.setReady();
}
break;
case JS_UNLOAD:
if (mWebChromeClient != null) {
final JsResult res = (JsResult) msg.obj;
String message = msg.getData().getString("message");
String url = msg.getData().getString("url");
if (!mWebChromeClient.onJsBeforeUnload(mWebView, url,
message, res)) {
final String m = mContext.getString(
R.string.js_dialog_before_unload, message);
new AlertDialog.Builder(mContext)
.setMessage(m)
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
res.confirm();
}
})
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
res.cancel();
}
})
.show();
}
res.setReady();
}
break;
case RECEIVED_CERTIFICATE:
mWebView.setCertificate((SslCertificate) msg.obj);
break;
case NOTIFY:
synchronized (this) {
notify();
}
break;
case SCALE_CHANGED:
if (mWebViewClient != null) {
mWebViewClient.onScaleChanged(mWebView, msg.getData()
.getFloat("old"), msg.getData().getFloat("new"));
}
break;
case SWITCH_OUT_HISTORY:
mWebView.switchOutDrawHistory();
break;
}
| public void | onCloseWindow(WebView window)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return;
}
sendMessage(obtainMessage(CLOSE_WINDOW, window));
| public boolean | onDownloadStart(java.lang.String url, java.lang.String userAgent, java.lang.String contentDisposition, java.lang.String mimetype, long contentLength)Starts a download if a download listener has been registered, otherwise
return false.
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mDownloadListener == null) {
// Cancel the download if there is no browser client.
return false;
}
Message msg = obtainMessage(DOWNLOAD_FILE);
Bundle bundle = msg.getData();
bundle.putString("url", url);
bundle.putString("userAgent", userAgent);
bundle.putString("mimetype", mimetype);
bundle.putLong("contentLength", contentLength);
bundle.putString("contentDisposition", contentDisposition);
sendMessage(msg);
return true;
| public void | onFormResubmission(android.os.Message dontResend, android.os.Message resend)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
dontResend.sendToTarget();
return;
}
Message msg = obtainMessage(RESEND_POST_DATA);
Bundle bundle = msg.getData();
bundle.putParcelable("resend", resend);
bundle.putParcelable("dontResend", dontResend);
sendMessage(msg);
| public void | onJsAlert(java.lang.String url, java.lang.String message)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return;
}
JsResult result = new JsResult(this, false);
Message alert = obtainMessage(JS_ALERT, result);
alert.getData().putString("message", message);
alert.getData().putString("url", url);
synchronized (this) {
sendMessage(alert);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for jsAlert");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
| public boolean | onJsBeforeUnload(java.lang.String url, java.lang.String message)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return true;
}
JsResult result = new JsResult(this, true);
Message confirm = obtainMessage(JS_UNLOAD, result);
confirm.getData().putString("message", message);
confirm.getData().putString("url", url);
synchronized (this) {
sendMessage(confirm);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for jsUnload");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
return result.getResult();
| public boolean | onJsConfirm(java.lang.String url, java.lang.String message)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return false;
}
JsResult result = new JsResult(this, false);
Message confirm = obtainMessage(JS_CONFIRM, result);
confirm.getData().putString("message", message);
confirm.getData().putString("url", url);
synchronized (this) {
sendMessage(confirm);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for jsConfirm");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
return result.getResult();
| public java.lang.String | onJsPrompt(java.lang.String url, java.lang.String message, java.lang.String defaultValue)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return null;
}
JsPromptResult result = new JsPromptResult(this);
Message prompt = obtainMessage(JS_PROMPT, result);
prompt.getData().putString("message", message);
prompt.getData().putString("default", defaultValue);
prompt.getData().putString("url", url);
synchronized (this) {
sendMessage(prompt);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for jsPrompt");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
return result.getStringResult();
| public void | onLoadResource(java.lang.String url)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
sendMessage(obtainMessage(LOAD_RESOURCE, url));
| public void | onPageFinished(java.lang.String url)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
// Performance probe
if (false) {
Log.d("WebCore", "WebCore thread used " +
(SystemClock.currentThreadTimeMillis() - mWebCoreThreadTime)
+ " ms");
Network.getInstance(mContext).stopTiming();
}
Message msg = obtainMessage(PAGE_FINISHED, url);
sendMessage(msg);
| public void | onPageStarted(java.lang.String url, android.graphics.Bitmap favicon)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
// Performance probe
if (false) {
mWebCoreThreadTime = SystemClock.currentThreadTimeMillis();
Network.getInstance(mContext).startTiming();
}
Message msg = obtainMessage(PAGE_STARTED);
msg.obj = favicon;
msg.getData().putString("url", url);
sendMessage(msg);
| public void | onProgressChanged(int newProgress)
// Synchronize so that mLatestProgress is up-to-date.
synchronized (this) {
mLatestProgress = newProgress;
if (mWebChromeClient == null) {
return;
}
if (!mProgressUpdatePending) {
sendEmptyMessage(PROGRESS);
mProgressUpdatePending = true;
}
}
| public void | onReceivedCertificate(android.net.http.SslCertificate certificate)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
// here, certificate can be null (if the site is not secure)
sendMessage(obtainMessage(RECEIVED_CERTIFICATE, certificate));
| public void | onReceivedError(int errorCode, java.lang.String description, java.lang.String failingUrl)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
Message msg = obtainMessage(REPORT_ERROR);
msg.arg1 = errorCode;
msg.getData().putString("description", description);
msg.getData().putString("failingUrl", failingUrl);
sendMessage(msg);
| public void | onReceivedHttpAuthRequest(HttpAuthHandler handler, java.lang.String hostName, java.lang.String realmName)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
handler.cancel();
return;
}
Message msg = obtainMessage(AUTH_REQUEST, handler);
msg.getData().putString("host", hostName);
msg.getData().putString("realm", realmName);
sendMessage(msg);
| public void | onReceivedIcon(android.graphics.Bitmap icon)
// The current item might be null if the icon was already stored in the
// database and this is a new WebView.
WebHistoryItem i = mBackForwardList.getCurrentItem();
if (i != null) {
i.setFavicon(icon);
}
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return;
}
sendMessage(obtainMessage(RECEIVED_ICON, icon));
| public void | onReceivedSslError(SslErrorHandler handler, android.net.http.SslError error)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
handler.cancel();
return;
}
Message msg = obtainMessage(SSL_ERROR);
//, handler);
HashMap<String, Object> map = new HashMap();
map.put("handler", handler);
map.put("error", error);
msg.obj = map;
sendMessage(msg);
| public void | onReceivedTitle(java.lang.String title)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return;
}
sendMessage(obtainMessage(RECEIVED_TITLE, title));
| public void | onRequestFocus()
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebChromeClient == null) {
return;
}
sendEmptyMessage(REQUEST_FOCUS);
| public boolean | onSavePassword(java.lang.String schemePlusHost, java.lang.String username, java.lang.String password, android.os.Message resumeMsg)
// resumeMsg should be null at this point because we want to create it
// within the CallbackProxy.
if (Config.DEBUG) {
junit.framework.Assert.assertNull(resumeMsg);
}
resumeMsg = obtainMessage(NOTIFY);
Message msg = obtainMessage(SAVE_PASSWORD, resumeMsg);
Bundle bundle = msg.getData();
bundle.putString("host", schemePlusHost);
bundle.putString("username", username);
bundle.putString("password", password);
synchronized (this) {
sendMessage(msg);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG,
"Caught exception while waiting for onSavePassword");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
// Doesn't matter here
return false;
| public void | onScaleChanged(float oldScale, float newScale)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
Message msg = obtainMessage(SCALE_CHANGED);
Bundle bundle = msg.getData();
bundle.putFloat("old", oldScale);
bundle.putFloat("new", newScale);
sendMessage(msg);
| public void | onTooManyRedirects(android.os.Message cancelMsg, android.os.Message continueMsg)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
cancelMsg.sendToTarget();
return;
}
Message msg = obtainMessage(TOO_MANY_REDIRECTS);
Bundle bundle = msg.getData();
bundle.putParcelable("cancelMsg", cancelMsg);
bundle.putParcelable("continueMsg", continueMsg);
sendMessage(msg);
| public void | onUnhandledKeyEvent(android.view.KeyEvent event)
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
if (mWebViewClient == null) {
return;
}
sendMessage(obtainMessage(ASYNC_KEYEVENTS, event));
| public void | setDownloadListener(DownloadListener client)Set the client DownloadListener.
mDownloadListener = client;
| public void | setWebChromeClient(WebChromeClient client)Set the WebChromeClient.
mWebChromeClient = client;
| public void | setWebViewClient(WebViewClient client)Set the WebViewClient.
mWebViewClient = client;
| public boolean | shouldOverrideUrlLoading(java.lang.String url)Called by the WebCore side
// We have a default behavior if no client exists so always send the
// message.
ResultTransport<Boolean> res = new ResultTransport<Boolean>();
Message msg = obtainMessage(OVERRIDE_URL);
msg.getData().putString("url", url);
msg.obj = res;
synchronized (this) {
sendMessage(msg);
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for overrideUrl");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
return res.getResult().booleanValue();
| void | switchOutDrawHistory()Called by WebCore side to switch out of history Picture drawing mode
sendMessage(obtainMessage(SWITCH_OUT_HISTORY));
| public boolean | uiOverrideKeyEvent(android.view.KeyEvent event)Called by UI side.
if (mWebViewClient != null) {
return mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
}
return false;
| public boolean | uiOverrideUrlLoading(java.lang.String overrideUrl)Called by the UI side. Calling overrideUrlLoading from the WebCore
side will post a message to call this method.
if (overrideUrl == null || overrideUrl.length() == 0) {
return false;
}
boolean override = false;
if (mWebViewClient != null) {
override = mWebViewClient.shouldOverrideUrlLoading(mWebView,
overrideUrl);
} else {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(overrideUrl));
intent.addCategory(Intent.CATEGORY_BROWSABLE);
// If another application is running a WebView and launches the
// Browser through this Intent, we want to reuse the same window if
// possible.
intent.putExtra(Browser.EXTRA_APPLICATION_ID,
mContext.getPackageName());
try {
mContext.startActivity(intent);
override = true;
} catch (ActivityNotFoundException ex) {
// If no application can handle the URL, assume that the
// browser can handle it.
}
}
return override;
|
|