From 2ba1262b420ef5b9abebcd818c46774b8517f244 Mon Sep 17 00:00:00 2001 From: Patrick Scott Date: Tue, 4 Aug 2009 13:20:05 -0400 Subject: [PATCH] Add a callback for the url of an apple-touch-icon. Hide the apis until this is a well-tested feature. The url is reported rather than the actual icon since it may never be used. The apple-touch-icon is meant for shortcuts on the home screen. --- core/java/android/provider/Browser.java | 11 ++++++++- core/java/android/webkit/BrowserFrame.java | 5 ++++ core/java/android/webkit/CallbackProxy.java | 23 +++++++++++++++++++ core/java/android/webkit/WebChromeClient.java | 8 +++++++ core/java/android/webkit/WebHistoryItem.java | 18 +++++++++++++++ core/java/android/webkit/WebView.java | 9 ++++++++ 6 files changed, 73 insertions(+), 1 deletion(-) diff --git a/core/java/android/provider/Browser.java b/core/java/android/provider/Browser.java index b95e4e1673b9d..92bc8142dea23 100644 --- a/core/java/android/provider/Browser.java +++ b/core/java/android/provider/Browser.java @@ -107,7 +107,8 @@ public class Browser { public static final String[] HISTORY_PROJECTION = new String[] { BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS, BookmarkColumns.DATE, BookmarkColumns.BOOKMARK, BookmarkColumns.TITLE, - BookmarkColumns.FAVICON, BookmarkColumns.THUMBNAIL }; + BookmarkColumns.FAVICON, BookmarkColumns.THUMBNAIL, + BookmarkColumns.TOUCH_ICON }; /* these indices dependent on HISTORY_PROJECTION */ public static final int HISTORY_PROJECTION_ID_INDEX = 0; @@ -121,6 +122,10 @@ public class Browser { * @hide */ public static final int HISTORY_PROJECTION_THUMBNAIL_INDEX = 7; + /** + * @hide + */ + public static final int HISTORY_PROJECTION_TOUCH_ICON_INDEX = 8; /* columns needed to determine whether to truncate history */ public static final String[] TRUNCATE_HISTORY_PROJECTION = new String[] { @@ -521,6 +526,10 @@ public class Browser { * @hide */ public static final String THUMBNAIL = "thumbnail"; + /** + * @hide + */ + public static final String TOUCH_ICON = "touch_icon"; } public static class SearchColumns implements BaseColumns { diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index e6ccd70ab74c2..06581c16956d0 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -615,6 +615,11 @@ class BrowserFrame extends Handler { mCallbackProxy.onReceivedIcon(icon); } + // Called by JNI when an apple-touch-icon attribute was found. + private void didReceiveTouchIconUrl(String url) { + mCallbackProxy.onReceivedTouchIconUrl(url); + } + /** * Request a new window from the client. * @return The BrowserFrame object stored in the new WebView. diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index ed77ce883e308..b2277cb4824e1 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -104,6 +104,7 @@ class CallbackProxy extends Handler { private static final int ADD_MESSAGE_TO_CONSOLE = 129; private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT = 130; private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT = 131; + private static final int RECEIVED_TOUCH_ICON_URL = 132; // Message triggered by the client to resume execution private static final int NOTIFY = 200; @@ -244,6 +245,13 @@ class CallbackProxy extends Handler { } break; + case RECEIVED_TOUCH_ICON_URL: + if (mWebChromeClient != null) { + mWebChromeClient.onReceivedTouchIconUrl(mWebView, + (String) msg.obj); + } + break; + case RECEIVED_TITLE: if (mWebChromeClient != null) { mWebChromeClient.onReceivedTitle(mWebView, @@ -1054,6 +1062,21 @@ class CallbackProxy extends Handler { sendMessage(obtainMessage(RECEIVED_ICON, icon)); } + /* package */ void onReceivedTouchIconUrl(String url) { + // We should have a current item but we do not want to crash so check + // for null. + WebHistoryItem i = mBackForwardList.getCurrentItem(); + if (i != null) { + i.setTouchIconUrl(url); + } + // Do an unsynchronized quick check to avoid posting if no callback has + // been set. + if (mWebChromeClient == null) { + return; + } + sendMessage(obtainMessage(RECEIVED_TOUCH_ICON_URL, url)); + } + public void onReceivedTitle(String title) { // Do an unsynchronized quick check to avoid posting if no callback has // been set. diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index d52406de79203..c10bc97de103a 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -44,6 +44,14 @@ public class WebChromeClient { */ public void onReceivedIcon(WebView view, Bitmap icon) {} + /** + * Notify the host application of the url for an apple-touch-icon. + * @param view The WebView that initiated the callback. + * @param url The icon url. + * @hide pending council approval + */ + public void onReceivedTouchIconUrl(WebView view, String url) {} + /** * A callback interface used by the host application to notify * the current page that its custom view has been dismissed. diff --git a/core/java/android/webkit/WebHistoryItem.java b/core/java/android/webkit/WebHistoryItem.java index fd26b9840176c..abd82377d68c6 100644 --- a/core/java/android/webkit/WebHistoryItem.java +++ b/core/java/android/webkit/WebHistoryItem.java @@ -39,6 +39,8 @@ public class WebHistoryItem implements Cloneable { private Bitmap mFavicon; // The pre-flattened data used for saving the state. private byte[] mFlattenedData; + // The apple-touch-icon url for use when adding the site to the home screen + private String mTouchIconUrl; /** * Basic constructor that assigns a unique id to the item. Called by JNI @@ -126,6 +128,14 @@ public class WebHistoryItem implements Cloneable { return mFavicon; } + /** + * Return the touch icon url. + * @hide + */ + public String getTouchIconUrl() { + return mTouchIconUrl; + } + /** * Set the favicon. * @param icon A Bitmap containing the favicon for this history item. @@ -136,6 +146,14 @@ public class WebHistoryItem implements Cloneable { mFavicon = icon; } + /** + * Set the touch icon url. + * @hide + */ + /*package*/ void setTouchIconUrl(String url) { + mTouchIconUrl = url; + } + /** * Get the pre-flattened data. * Note: The VM ensures 32-bit atomic read/write operations so we don't have diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 3b81eed153914..444ef54d7bf55 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2002,6 +2002,15 @@ public class WebView extends AbsoluteLayout return h != null ? h.getFavicon() : null; } + /** + * Get the touch icon url for the apple-touch-icon element. + * @hide + */ + public String getTouchIconUrl() { + WebHistoryItem h = mCallbackProxy.getBackForwardList().getCurrentItem(); + return h != null ? h.getTouchIconUrl() : null; + } + /** * Get the progress for the current page. * @return The progress for the current page between 0 and 100.