favicon_helper.cc revision 010d83a9304c5a91596085d917d248abff47903a
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/android/favicon_helper.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <jni.h> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/android/jni_android.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/android/jni_array.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/android/jni_string.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/android/scoped_java_ref.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/strings/string_util.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/favicon/favicon_service.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/favicon/favicon_service_factory.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile_android.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/open_tabs_ui_delegate.h" 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "jni/FaviconHelper_jni.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/android/java_bitmap.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/color_analysis.h" 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/color_utils.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::ScopedJavaGlobalRef; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::ScopedJavaLocalRef; 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::AttachCurrentThread; 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::ConvertJavaStringToUTF16; 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8; 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::android::ConvertUTF8ToJavaString; 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void OnLocalFaviconAvailable( 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaGlobalRef<jobject>* j_favicon_image_callback, 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const favicon_base::FaviconImageResult& favicon_image_result) { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch JNIEnv* env = AttachCurrentThread(); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Convert favicon_image_result to java objects. 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaLocalRef<jstring> j_icon_url = 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ConvertUTF8ToJavaString(env, favicon_image_result.icon_url.spec()); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap favicon_bitmap = favicon_image_result.image.AsBitmap(); 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!favicon_bitmap.isNull()) 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Call java side OnLocalFaviconAvailable method. 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Java_FaviconImageCallback_onFaviconAvailable(env, 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_favicon_image_callback->obj(), 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_favicon_bitmap.obj(), 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_icon_url.obj()); 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void OnFaviconBitmapResultAvailable( 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaGlobalRef<jobject>* j_favicon_image_callback, 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const favicon_base::FaviconBitmapResult& favicon_bitmap_result) { 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Convert favicon_image_result to java objects. 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaLocalRef<jstring> j_icon_url = 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConvertUTF8ToJavaString(env, favicon_bitmap_result.icon_url.spec()); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SkBitmap favicon_bitmap; 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (favicon_bitmap_result.is_valid()) { 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::PNGCodec::Decode(favicon_bitmap_result.bitmap_data->front(), 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) favicon_bitmap_result.bitmap_data->size(), 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &favicon_bitmap); 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!favicon_bitmap.isNull()) 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Call java side OnLocalFaviconAvailable method. 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Java_FaviconImageCallback_onFaviconAvailable(env, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_image_callback->obj(), 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_bitmap.obj(), 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_icon_url.obj()); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jclass clazz) { 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return reinterpret_cast<intptr_t>(new FaviconHelper()); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochFaviconHelper::FaviconHelper() { 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cancelable_task_tracker_.reset(new base::CancelableTaskTracker()); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FaviconHelper::Destroy(JNIEnv* env, jobject obj) { 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete this; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)jboolean FaviconHelper::GetLocalFaviconImageForURL( 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env, 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject obj, 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject j_profile, 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jstring j_page_url, 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jint j_icon_types, 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jint j_desired_size_in_dip, 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject j_favicon_image_callback) { 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(profile); 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!profile) 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile, Profile::EXPLICIT_ACCESS); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(favicon_service); 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!favicon_service) 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FaviconService::FaviconForURLParams params( 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL(ConvertJavaStringToUTF16(env, j_page_url)), 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static_cast<int>(j_icon_types), 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static_cast<int>(j_desired_size_in_dip)); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new ScopedJavaGlobalRef<jobject>(); 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_scoped_favicon_callback->Reset(env, j_favicon_image_callback); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FaviconService::FaviconImageCallback callback_runner = base::Bind( 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &OnLocalFaviconAvailable, base::Owned(j_scoped_favicon_callback)); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch favicon_service->GetFaviconImageForURL( 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params, callback_runner, 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancelable_task_tracker_.get()); 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FaviconHelper::GetLargestRawFaviconForUrl( 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) JNIEnv* env, 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject obj, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject j_profile, 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jstring j_page_url, 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jintArray j_icon_types, 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jint j_min_size_threshold_px, 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject j_favicon_image_callback) { 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(profile); 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!profile) 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile, Profile::EXPLICIT_ACCESS); 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(favicon_service); 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!favicon_service) 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<int> icon_types; 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::android::JavaIntArrayToIntVector(env, j_icon_types, &icon_types); 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new ScopedJavaGlobalRef<jobject>(); 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_scoped_favicon_callback->Reset(env, j_favicon_image_callback); 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FaviconService::FaviconRawCallback callback_runner = base::Bind( 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &OnFaviconBitmapResultAvailable, base::Owned(j_scoped_favicon_callback)); 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) favicon_service->GetLargestRawFaviconForURL( 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile, 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL(ConvertJavaStringToUTF16(env, j_page_url)), 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) icon_types, 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<int>(j_min_size_threshold_px), 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_runner, 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cancelable_task_tracker_.get()); 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ScopedJavaLocalRef<jobject> FaviconHelper::GetSyncedFaviconImageForURL( 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env, 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject obj, 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject jprofile, 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jstring j_page_url) { 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(profile); 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string page_url = ConvertJavaStringToUTF8(env, j_page_url); 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService* sync_service = 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(sync_service); 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> favicon_png; 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_sync::OpenTabsUIDelegate* open_tabs = 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_service->GetOpenTabsUIDelegate(); 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(open_tabs); 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!open_tabs->GetSyncedFaviconForPageURL(page_url, &favicon_png)) 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ScopedJavaLocalRef<jobject>(); 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Convert favicon_image_result to java objects. 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Image favicon_image = gfx::Image::CreateFrom1xPNGBytes(favicon_png); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SkBitmap favicon_bitmap = favicon_image.AsBitmap(); 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (favicon_bitmap.isNull()) 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ScopedJavaLocalRef<jobject>(); 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ConvertToJavaBitmap(&favicon_bitmap); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)FaviconHelper::~FaviconHelper() {} 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static jint GetDominantColorForBitmap(JNIEnv* env, 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) jclass clazz, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) jobject bitmap) { 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!bitmap) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return 0; 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::JavaBitmap bitmap_lock(bitmap); 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(bitmap_lock); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return color_utils::CalculateKMeanColorOfBitmap(skbitmap); 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool FaviconHelper::RegisterFaviconHelper(JNIEnv* env) { 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RegisterNativesImpl(env); 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 225