| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/shortcut_helper.h" | 5 #include "chrome/browser/android/shortcut_helper.h" |
| 6 | 6 |
| 7 #include <jni.h> | 7 #include <jni.h> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "chrome/common/render_messages.h" | 24 #include "chrome/common/render_messages.h" |
| 25 #include "chrome/common/web_application_info.h" | 25 #include "chrome/common/web_application_info.h" |
| 26 #include "components/dom_distiller/core/url_utils.h" | 26 #include "components/dom_distiller/core/url_utils.h" |
| 27 #include "content/public/browser/user_metrics.h" | 27 #include "content/public/browser/user_metrics.h" |
| 28 #include "content/public/browser/web_contents.h" | 28 #include "content/public/browser/web_contents.h" |
| 29 #include "content/public/browser/web_contents_observer.h" | 29 #include "content/public/browser/web_contents_observer.h" |
| 30 #include "content/public/common/frame_navigate_params.h" | 30 #include "content/public/common/frame_navigate_params.h" |
| 31 #include "content/public/common/manifest.h" | 31 #include "content/public/common/manifest.h" |
| 32 #include "jni/ShortcutHelper_jni.h" | 32 #include "jni/ShortcutHelper_jni.h" |
| 33 #include "net/base/mime_util.h" | 33 #include "net/base/mime_util.h" |
| 34 #include "third_party/WebKit/public/platform/WebScreenOrientationLockType.h" |
| 34 #include "ui/gfx/android/java_bitmap.h" | 35 #include "ui/gfx/android/java_bitmap.h" |
| 35 #include "ui/gfx/codec/png_codec.h" | 36 #include "ui/gfx/codec/png_codec.h" |
| 36 #include "ui/gfx/color_analysis.h" | 37 #include "ui/gfx/color_analysis.h" |
| 37 #include "ui/gfx/favicon_size.h" | 38 #include "ui/gfx/favicon_size.h" |
| 38 #include "ui/gfx/screen.h" | 39 #include "ui/gfx/screen.h" |
| 39 #include "url/gurl.h" | 40 #include "url/gurl.h" |
| 40 | 41 |
| 41 using content::Manifest; | 42 using content::Manifest; |
| 42 | 43 |
| 43 // Android's preferred icon size in DP is 48, as defined in | 44 // Android's preferred icon size in DP is 48, as defined in |
| 44 // http://developer.android.com/design/style/iconography.html | 45 // http://developer.android.com/design/style/iconography.html |
| 45 const int ShortcutHelper::kPreferredIconSizeInDp = 48; | 46 const int ShortcutHelper::kPreferredIconSizeInDp = 48; |
| 46 | 47 |
| 47 jlong Initialize(JNIEnv* env, jobject obj, jlong tab_android_ptr) { | 48 jlong Initialize(JNIEnv* env, jobject obj, jlong tab_android_ptr) { |
| 48 TabAndroid* tab = reinterpret_cast<TabAndroid*>(tab_android_ptr); | 49 TabAndroid* tab = reinterpret_cast<TabAndroid*>(tab_android_ptr); |
| 49 | 50 |
| 50 ShortcutHelper* shortcut_helper = | 51 ShortcutHelper* shortcut_helper = |
| 51 new ShortcutHelper(env, obj, tab->web_contents()); | 52 new ShortcutHelper(env, obj, tab->web_contents()); |
| 52 shortcut_helper->Initialize(); | 53 shortcut_helper->Initialize(); |
| 53 | 54 |
| 54 return reinterpret_cast<intptr_t>(shortcut_helper); | 55 return reinterpret_cast<intptr_t>(shortcut_helper); |
| 55 } | 56 } |
| 56 | 57 |
| 57 ShortcutHelper::ShortcutHelper(JNIEnv* env, | 58 ShortcutHelper::ShortcutHelper(JNIEnv* env, |
| 58 jobject obj, | 59 jobject obj, |
| 59 content::WebContents* web_contents) | 60 content::WebContents* web_contents) |
| 60 : WebContentsObserver(web_contents), | 61 : WebContentsObserver(web_contents), |
| 61 java_ref_(env, obj), | 62 java_ref_(env, obj), |
| 62 url_(dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( | 63 shortcut_info_(dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( |
| 63 web_contents->GetURL())), | 64 web_contents->GetURL())), |
| 64 display_(content::Manifest::DISPLAY_MODE_BROWSER), | |
| 65 orientation_(blink::WebScreenOrientationLockDefault), | |
| 66 add_shortcut_requested_(false), | 65 add_shortcut_requested_(false), |
| 67 manifest_icon_status_(MANIFEST_ICON_STATUS_NONE), | 66 manifest_icon_status_(MANIFEST_ICON_STATUS_NONE), |
| 68 preferred_icon_size_in_px_(kPreferredIconSizeInDp * | 67 preferred_icon_size_in_px_(kPreferredIconSizeInDp * |
| 69 gfx::Screen::GetScreenFor(web_contents->GetNativeView())-> | 68 gfx::Screen::GetScreenFor(web_contents->GetNativeView())-> |
| 70 GetPrimaryDisplay().device_scale_factor()), | 69 GetPrimaryDisplay().device_scale_factor()), |
| 71 weak_ptr_factory_(this) { | 70 weak_ptr_factory_(this) { |
| 72 } | 71 } |
| 73 | 72 |
| 74 void ShortcutHelper::Initialize() { | 73 void ShortcutHelper::Initialize() { |
| 75 // Send a message to the renderer to retrieve information about the page. | 74 // Send a message to the renderer to retrieve information about the page. |
| 76 Send(new ChromeViewMsg_GetWebApplicationInfo(routing_id())); | 75 Send(new ChromeViewMsg_GetWebApplicationInfo(routing_id())); |
| 77 } | 76 } |
| 78 | 77 |
| 79 ShortcutHelper::~ShortcutHelper() { | 78 ShortcutHelper::~ShortcutHelper() { |
| 80 } | 79 } |
| 81 | 80 |
| 82 void ShortcutHelper::OnDidGetWebApplicationInfo( | 81 void ShortcutHelper::OnDidGetWebApplicationInfo( |
| 83 const WebApplicationInfo& received_web_app_info) { | 82 const WebApplicationInfo& received_web_app_info) { |
| 84 // Sanitize received_web_app_info. | 83 // Sanitize received_web_app_info. |
| 85 WebApplicationInfo web_app_info = received_web_app_info; | 84 WebApplicationInfo web_app_info = received_web_app_info; |
| 86 web_app_info.title = | 85 web_app_info.title = |
| 87 web_app_info.title.substr(0, chrome::kMaxMetaTagAttributeLength); | 86 web_app_info.title.substr(0, chrome::kMaxMetaTagAttributeLength); |
| 88 web_app_info.description = | 87 web_app_info.description = |
| 89 web_app_info.description.substr(0, chrome::kMaxMetaTagAttributeLength); | 88 web_app_info.description.substr(0, chrome::kMaxMetaTagAttributeLength); |
| 90 | 89 |
| 91 title_ = web_app_info.title.empty() ? web_contents()->GetTitle() | 90 shortcut_info_.title = web_app_info.title.empty() ? web_contents()->GetTitle() |
| 92 : web_app_info.title; | 91 : web_app_info.title; |
| 93 | 92 |
| 94 if (web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE || | 93 if (web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE || |
| 95 web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE_APPLE) { | 94 web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE_APPLE) { |
| 96 display_ = content::Manifest::DISPLAY_MODE_STANDALONE; | 95 shortcut_info_.display = content::Manifest::DISPLAY_MODE_STANDALONE; |
| 97 } | 96 } |
| 98 | 97 |
| 99 // Record what type of shortcut was added by the user. | 98 // Record what type of shortcut was added by the user. |
| 100 switch (web_app_info.mobile_capable) { | 99 switch (web_app_info.mobile_capable) { |
| 101 case WebApplicationInfo::MOBILE_CAPABLE: | 100 case WebApplicationInfo::MOBILE_CAPABLE: |
| 102 content::RecordAction( | 101 content::RecordAction( |
| 103 base::UserMetricsAction("webapps.AddShortcut.AppShortcut")); | 102 base::UserMetricsAction("webapps.AddShortcut.AppShortcut")); |
| 104 break; | 103 break; |
| 105 case WebApplicationInfo::MOBILE_CAPABLE_APPLE: | 104 case WebApplicationInfo::MOBILE_CAPABLE_APPLE: |
| 106 content::RecordAction( | 105 content::RecordAction( |
| 107 base::UserMetricsAction("webapps.AddShortcut.AppShortcutApple")); | 106 base::UserMetricsAction("webapps.AddShortcut.AppShortcutApple")); |
| 108 break; | 107 break; |
| 109 case WebApplicationInfo::MOBILE_CAPABLE_UNSPECIFIED: | 108 case WebApplicationInfo::MOBILE_CAPABLE_UNSPECIFIED: |
| 110 content::RecordAction( | 109 content::RecordAction( |
| 111 base::UserMetricsAction("webapps.AddShortcut.Bookmark")); | 110 base::UserMetricsAction("webapps.AddShortcut.Bookmark")); |
| 112 break; | 111 break; |
| 113 } | 112 } |
| 114 | 113 |
| 115 web_contents()->GetManifest(base::Bind(&ShortcutHelper::OnDidGetManifest, | 114 web_contents()->GetManifest(base::Bind(&ShortcutHelper::OnDidGetManifest, |
| 116 weak_ptr_factory_.GetWeakPtr())); | 115 weak_ptr_factory_.GetWeakPtr())); |
| 117 } | 116 } |
| 118 | 117 |
| 119 void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) { | 118 void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) { |
| 120 if (!manifest.IsEmpty()) { | 119 if (!manifest.IsEmpty()) { |
| 121 content::RecordAction( | 120 content::RecordAction( |
| 122 base::UserMetricsAction("webapps.AddShortcut.Manifest")); | 121 base::UserMetricsAction("webapps.AddShortcut.Manifest")); |
| 123 } | 122 } |
| 124 | 123 |
| 125 // Set the title based on the manifest value, if any. | 124 shortcut_info_.UpdateFromManifest(manifest); |
| 126 if (!manifest.short_name.is_null()) | |
| 127 title_ = manifest.short_name.string(); | |
| 128 else if (!manifest.name.is_null()) | |
| 129 title_ = manifest.name.string(); | |
| 130 | |
| 131 // Set the url based on the manifest value, if any. | |
| 132 if (manifest.start_url.is_valid()) | |
| 133 url_ = manifest.start_url; | |
| 134 | |
| 135 // Set the display based on the manifest value, if any. | |
| 136 if (manifest.display != content::Manifest::DISPLAY_MODE_UNSPECIFIED) | |
| 137 display_ = manifest.display; | |
| 138 | |
| 139 // 'fullscreen' and 'minimal-ui' are not yet supported, fallback to the right | |
| 140 // mode in those cases. | |
| 141 if (manifest.display == content::Manifest::DISPLAY_MODE_FULLSCREEN) | |
| 142 display_ = content::Manifest::DISPLAY_MODE_STANDALONE; | |
| 143 if (manifest.display == content::Manifest::DISPLAY_MODE_MINIMAL_UI) | |
| 144 display_ = content::Manifest::DISPLAY_MODE_BROWSER; | |
| 145 | |
| 146 // Set the orientation based on the manifest value, if any. | |
| 147 if (manifest.orientation != blink::WebScreenOrientationLockDefault) { | |
| 148 // Ignore the orientation if the display mode is different from | |
| 149 // 'standalone'. | |
| 150 // TODO(mlamouri): send a message to the developer console about this. | |
| 151 if (display_ == content::Manifest::DISPLAY_MODE_STANDALONE) | |
| 152 orientation_ = manifest.orientation; | |
| 153 } | |
| 154 | 125 |
| 155 GURL icon_src = ManifestIconSelector::FindBestMatchingIcon( | 126 GURL icon_src = ManifestIconSelector::FindBestMatchingIcon( |
| 156 manifest.icons, | 127 manifest.icons, |
| 157 kPreferredIconSizeInDp, | 128 kPreferredIconSizeInDp, |
| 158 gfx::Screen::GetScreenFor(web_contents()->GetNativeView())); | 129 gfx::Screen::GetScreenFor(web_contents()->GetNativeView())); |
| 159 if (icon_src.is_valid()) { | 130 if (icon_src.is_valid()) { |
| 160 web_contents()->DownloadImage(icon_src, | 131 web_contents()->DownloadImage(icon_src, |
| 161 false, | 132 false, |
| 162 preferred_icon_size_in_px_, | 133 preferred_icon_size_in_px_, |
| 163 base::Bind(&ShortcutHelper::OnDidDownloadIcon, | 134 base::Bind(&ShortcutHelper::OnDidDownloadIcon, |
| 164 weak_ptr_factory_.GetWeakPtr())); | 135 weak_ptr_factory_.GetWeakPtr())); |
| 165 manifest_icon_status_ = MANIFEST_ICON_STATUS_FETCHING; | 136 manifest_icon_status_ = MANIFEST_ICON_STATUS_FETCHING; |
| 166 } | 137 } |
| 167 | 138 |
| 168 // The ShortcutHelper is now able to notify its Java counterpart that it is | 139 // The ShortcutHelper is now able to notify its Java counterpart that it is |
| 169 // initialized. OnInitialized method is not conceptually part of getting the | 140 // initialized. OnInitialized method is not conceptually part of getting the |
| 170 // manifest data but it happens that the initialization is finalized when | 141 // manifest data but it happens that the initialization is finalized when |
| 171 // these data are available. | 142 // these data are available. |
| 172 JNIEnv* env = base::android::AttachCurrentThread(); | 143 JNIEnv* env = base::android::AttachCurrentThread(); |
| 173 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); | 144 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); |
| 174 ScopedJavaLocalRef<jstring> j_title = | 145 ScopedJavaLocalRef<jstring> j_title = |
| 175 base::android::ConvertUTF16ToJavaString(env, title_); | 146 base::android::ConvertUTF16ToJavaString(env, shortcut_info_.title); |
| 176 | 147 |
| 177 Java_ShortcutHelper_onInitialized(env, j_obj.obj(), j_title.obj()); | 148 Java_ShortcutHelper_onInitialized(env, j_obj.obj(), j_title.obj()); |
| 178 } | 149 } |
| 179 | 150 |
| 180 void ShortcutHelper::OnDidDownloadIcon(int id, | 151 void ShortcutHelper::OnDidDownloadIcon(int id, |
| 181 int http_status_code, | 152 int http_status_code, |
| 182 const GURL& url, | 153 const GURL& url, |
| 183 const std::vector<SkBitmap>& bitmaps, | 154 const std::vector<SkBitmap>& bitmaps, |
| 184 const std::vector<gfx::Size>& sizes) { | 155 const std::vector<gfx::Size>& sizes) { |
| 185 // If getting the candidate manifest icon failed, the ShortcutHelper should | 156 // If getting the candidate manifest icon failed, the ShortcutHelper should |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 | 192 |
| 222 void ShortcutHelper::AddShortcut( | 193 void ShortcutHelper::AddShortcut( |
| 223 JNIEnv* env, | 194 JNIEnv* env, |
| 224 jobject obj, | 195 jobject obj, |
| 225 jstring jtitle, | 196 jstring jtitle, |
| 226 jint launcher_large_icon_size) { | 197 jint launcher_large_icon_size) { |
| 227 add_shortcut_requested_ = true; | 198 add_shortcut_requested_ = true; |
| 228 | 199 |
| 229 base::string16 title = base::android::ConvertJavaStringToUTF16(env, jtitle); | 200 base::string16 title = base::android::ConvertJavaStringToUTF16(env, jtitle); |
| 230 if (!title.empty()) | 201 if (!title.empty()) |
| 231 title_ = title; | 202 shortcut_info_.title = title; |
| 232 | 203 |
| 233 switch (manifest_icon_status_) { | 204 switch (manifest_icon_status_) { |
| 234 case MANIFEST_ICON_STATUS_NONE: | 205 case MANIFEST_ICON_STATUS_NONE: |
| 235 AddShortcutUsingFavicon(); | 206 AddShortcutUsingFavicon(); |
| 236 break; | 207 break; |
| 237 case MANIFEST_ICON_STATUS_FETCHING: | 208 case MANIFEST_ICON_STATUS_FETCHING: |
| 238 // ::OnDidDownloadIcon() will call AddShortcutUsingManifestIcon(). | 209 // ::OnDidDownloadIcon() will call AddShortcutUsingManifestIcon(). |
| 239 break; | 210 break; |
| 240 case MANIFEST_ICON_STATUS_DONE: | 211 case MANIFEST_ICON_STATUS_DONE: |
| 241 AddShortcutUsingManifestIcon(); | 212 AddShortcutUsingManifestIcon(); |
| 242 break; | 213 break; |
| 243 } | 214 } |
| 244 } | 215 } |
| 245 | 216 |
| 246 void ShortcutHelper::AddShortcutUsingManifestIcon() { | 217 void ShortcutHelper::AddShortcutUsingManifestIcon() { |
| 247 // Stop observing so we don't get destroyed while doing the last steps. | 218 // Stop observing so we don't get destroyed while doing the last steps. |
| 248 Observe(NULL); | 219 Observe(NULL); |
| 249 | 220 |
| 250 base::WorkerPool::PostTask( | 221 base::WorkerPool::PostTask( |
| 251 FROM_HERE, | 222 FROM_HERE, |
| 252 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithSkBitmap, | 223 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithSkBitmap, |
| 253 url_, | 224 shortcut_info_, |
| 254 title_, | 225 manifest_icon_), |
| 255 display_, | |
| 256 manifest_icon_, | |
| 257 orientation_), | |
| 258 true); | 226 true); |
| 259 | 227 |
| 260 Destroy(); | 228 Destroy(); |
| 261 } | 229 } |
| 262 | 230 |
| 263 void ShortcutHelper::AddShortcutUsingFavicon() { | 231 void ShortcutHelper::AddShortcutUsingFavicon() { |
| 264 Profile* profile = | 232 Profile* profile = |
| 265 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 233 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| 266 | 234 |
| 267 // Grab the best, largest icon we can find to represent this bookmark. | 235 // Grab the best, largest icon we can find to represent this bookmark. |
| 268 // TODO(dfalcantara): Try combining with the new BookmarksHandler once its | 236 // TODO(dfalcantara): Try combining with the new BookmarksHandler once its |
| 269 // rewrite is further along. | 237 // rewrite is further along. |
| 270 std::vector<int> icon_types; | 238 std::vector<int> icon_types; |
| 271 icon_types.push_back(favicon_base::FAVICON); | 239 icon_types.push_back(favicon_base::FAVICON); |
| 272 icon_types.push_back(favicon_base::TOUCH_PRECOMPOSED_ICON | | 240 icon_types.push_back(favicon_base::TOUCH_PRECOMPOSED_ICON | |
| 273 favicon_base::TOUCH_ICON); | 241 favicon_base::TOUCH_ICON); |
| 274 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( | 242 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( |
| 275 profile, ServiceAccessType::EXPLICIT_ACCESS); | 243 profile, ServiceAccessType::EXPLICIT_ACCESS); |
| 276 | 244 |
| 277 // Using favicon if its size is not smaller than platform required size, | 245 // Using favicon if its size is not smaller than platform required size, |
| 278 // otherwise using the largest icon among all avaliable icons. | 246 // otherwise using the largest icon among all avaliable icons. |
| 279 int threshold_to_get_any_largest_icon = preferred_icon_size_in_px_ - 1; | 247 int threshold_to_get_any_largest_icon = preferred_icon_size_in_px_ - 1; |
| 280 favicon_service->GetLargestRawFaviconForPageURL(url_, icon_types, | 248 favicon_service->GetLargestRawFaviconForPageURL( |
| 249 shortcut_info_.url, |
| 250 icon_types, |
| 281 threshold_to_get_any_largest_icon, | 251 threshold_to_get_any_largest_icon, |
| 282 base::Bind(&ShortcutHelper::OnDidGetFavicon, | 252 base::Bind(&ShortcutHelper::OnDidGetFavicon, |
| 283 base::Unretained(this)), | 253 base::Unretained(this)), |
| 284 &cancelable_task_tracker_); | 254 &cancelable_task_tracker_); |
| 285 } | 255 } |
| 286 | 256 |
| 287 void ShortcutHelper::OnDidGetFavicon( | 257 void ShortcutHelper::OnDidGetFavicon( |
| 288 const favicon_base::FaviconRawBitmapResult& bitmap_result) { | 258 const favicon_base::FaviconRawBitmapResult& bitmap_result) { |
| 289 // Stop observing so we don't get destroyed while doing the last steps. | 259 // Stop observing so we don't get destroyed while doing the last steps. |
| 290 Observe(NULL); | 260 Observe(NULL); |
| 291 | 261 |
| 292 base::WorkerPool::PostTask( | 262 base::WorkerPool::PostTask( |
| 293 FROM_HERE, | 263 FROM_HERE, |
| 294 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithRawBitmap, | 264 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithRawBitmap, |
| 295 url_, | 265 shortcut_info_, |
| 296 title_, | 266 bitmap_result), |
| 297 display_, | |
| 298 bitmap_result, | |
| 299 orientation_), | |
| 300 true); | 267 true); |
| 301 | 268 |
| 302 Destroy(); | 269 Destroy(); |
| 303 } | 270 } |
| 304 | 271 |
| 305 bool ShortcutHelper::OnMessageReceived(const IPC::Message& message) { | 272 bool ShortcutHelper::OnMessageReceived(const IPC::Message& message) { |
| 306 bool handled = true; | 273 bool handled = true; |
| 307 | 274 |
| 308 IPC_BEGIN_MESSAGE_MAP(ShortcutHelper, message) | 275 IPC_BEGIN_MESSAGE_MAP(ShortcutHelper, message) |
| 309 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidGetWebApplicationInfo, | 276 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidGetWebApplicationInfo, |
| 310 OnDidGetWebApplicationInfo) | 277 OnDidGetWebApplicationInfo) |
| 311 IPC_MESSAGE_UNHANDLED(handled = false) | 278 IPC_MESSAGE_UNHANDLED(handled = false) |
| 312 IPC_END_MESSAGE_MAP() | 279 IPC_END_MESSAGE_MAP() |
| 313 | 280 |
| 314 return handled; | 281 return handled; |
| 315 } | 282 } |
| 316 | 283 |
| 317 void ShortcutHelper::WebContentsDestroyed() { | 284 void ShortcutHelper::WebContentsDestroyed() { |
| 318 Destroy(); | 285 Destroy(); |
| 319 } | 286 } |
| 320 | 287 |
| 321 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) { | 288 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) { |
| 322 return RegisterNativesImpl(env); | 289 return RegisterNativesImpl(env); |
| 323 } | 290 } |
| 324 | 291 |
| 325 void ShortcutHelper::AddShortcutInBackgroundWithRawBitmap( | 292 void ShortcutHelper::AddShortcutInBackgroundWithRawBitmap( |
| 326 const GURL& url, | 293 const ShortcutInfo& info, |
| 327 const base::string16& title, | 294 const favicon_base::FaviconRawBitmapResult& bitmap_result) { |
| 328 content::Manifest::DisplayMode display, | |
| 329 const favicon_base::FaviconRawBitmapResult& bitmap_result, | |
| 330 blink::WebScreenOrientationLockType orientation) { | |
| 331 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); | 295 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); |
| 332 | 296 |
| 333 SkBitmap icon_bitmap; | 297 SkBitmap icon_bitmap; |
| 334 if (bitmap_result.is_valid()) { | 298 if (bitmap_result.is_valid()) { |
| 335 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(), | 299 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(), |
| 336 bitmap_result.bitmap_data->size(), | 300 bitmap_result.bitmap_data->size(), |
| 337 &icon_bitmap); | 301 &icon_bitmap); |
| 338 } | 302 } |
| 339 | 303 |
| 340 AddShortcutInBackgroundWithSkBitmap( | 304 AddShortcutInBackgroundWithSkBitmap(info, icon_bitmap); |
| 341 url, title, display, icon_bitmap, orientation); | |
| 342 } | 305 } |
| 343 | 306 |
| 344 void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap( | 307 void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap( |
| 345 const GURL& url, | 308 const ShortcutInfo& info, |
| 346 const base::string16& title, | 309 const SkBitmap& icon_bitmap) { |
| 347 content::Manifest::DisplayMode display, | |
| 348 const SkBitmap& icon_bitmap, | |
| 349 blink::WebScreenOrientationLockType orientation) { | |
| 350 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); | 310 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); |
| 351 | 311 |
| 352 SkColor color = color_utils::CalculateKMeanColorOfBitmap(icon_bitmap); | 312 SkColor color = color_utils::CalculateKMeanColorOfBitmap(icon_bitmap); |
| 353 int r_value = SkColorGetR(color); | 313 int r_value = SkColorGetR(color); |
| 354 int g_value = SkColorGetG(color); | 314 int g_value = SkColorGetG(color); |
| 355 int b_value = SkColorGetB(color); | 315 int b_value = SkColorGetB(color); |
| 356 | 316 |
| 357 // Send the data to the Java side to create the shortcut. | 317 // Send the data to the Java side to create the shortcut. |
| 358 JNIEnv* env = base::android::AttachCurrentThread(); | 318 JNIEnv* env = base::android::AttachCurrentThread(); |
| 359 ScopedJavaLocalRef<jstring> java_url = | 319 ScopedJavaLocalRef<jstring> java_url = |
| 360 base::android::ConvertUTF8ToJavaString(env, url.spec()); | 320 base::android::ConvertUTF8ToJavaString(env, info.url.spec()); |
| 361 ScopedJavaLocalRef<jstring> java_title = | 321 ScopedJavaLocalRef<jstring> java_title = |
| 362 base::android::ConvertUTF16ToJavaString(env, title); | 322 base::android::ConvertUTF16ToJavaString(env, info.title); |
| 363 ScopedJavaLocalRef<jobject> java_bitmap; | 323 ScopedJavaLocalRef<jobject> java_bitmap; |
| 364 if (icon_bitmap.getSize()) | 324 if (icon_bitmap.getSize()) |
| 365 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); | 325 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); |
| 366 | 326 |
| 367 Java_ShortcutHelper_addShortcut( | 327 Java_ShortcutHelper_addShortcut( |
| 368 env, | 328 env, |
| 369 base::android::GetApplicationContext(), | 329 base::android::GetApplicationContext(), |
| 370 java_url.obj(), | 330 java_url.obj(), |
| 371 java_title.obj(), | 331 java_title.obj(), |
| 372 java_bitmap.obj(), | 332 java_bitmap.obj(), |
| 373 r_value, | 333 r_value, |
| 374 g_value, | 334 g_value, |
| 375 b_value, | 335 b_value, |
| 376 display == content::Manifest::DISPLAY_MODE_STANDALONE, | 336 info.display == content::Manifest::DISPLAY_MODE_STANDALONE, |
| 377 orientation); | 337 info.orientation); |
| 378 } | 338 } |
| OLD | NEW |