favicon_helper.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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, 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const favicon_base::FaviconRawBitmapResult& 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 = 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConvertUTF8ToJavaString(env, result.icon_url.spec()); 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (result.is_valid()) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SkBitmap favicon_bitmap; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::PNGCodec::Decode(result.bitmap_data->front(), 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.bitmap_data->size(), 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &favicon_bitmap); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!favicon_bitmap.isNull()) 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Call java side OnLocalFaviconAvailable method. 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Java_FaviconImageCallback_onFaviconAvailable(env, 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_favicon_image_callback->obj(), 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_favicon_bitmap.obj(), 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) j_icon_url.obj()); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void OnFaviconRawBitmapResultAvailable( 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaGlobalRef<jobject>* j_favicon_image_callback, 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapResult& favicon_bitmap_result) { 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Convert favicon_image_result to java objects. 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaLocalRef<jstring> j_icon_url = 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConvertUTF8ToJavaString(env, favicon_bitmap_result.icon_url.spec()); 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SkBitmap favicon_bitmap; 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (favicon_bitmap_result.is_valid()) { 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::PNGCodec::Decode(favicon_bitmap_result.bitmap_data->front(), 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) favicon_bitmap_result.bitmap_data->size(), 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &favicon_bitmap); 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!favicon_bitmap.isNull()) 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Call java side OnLocalFaviconAvailable method. 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Java_FaviconImageCallback_onFaviconAvailable(env, 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_image_callback->obj(), 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_favicon_bitmap.obj(), 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_icon_url.obj()); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jclass clazz) { 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return reinterpret_cast<intptr_t>(new FaviconHelper()); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochFaviconHelper::FaviconHelper() { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cancelable_task_tracker_.reset(new base::CancelableTaskTracker()); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FaviconHelper::Destroy(JNIEnv* env, jobject obj) { 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete this; 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)jboolean FaviconHelper::GetLocalFaviconImageForURL( 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env, 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject obj, 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject j_profile, 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jstring j_page_url, 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jint j_icon_types, 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch jint j_desired_size_in_pixel, 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject j_favicon_image_callback) { 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(profile); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!profile) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile, Profile::EXPLICIT_ACCESS); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(favicon_service); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!favicon_service) 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 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 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_base::FaviconRawBitmapCallback callback_runner = base::Bind( 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &OnLocalFaviconAvailable, base::Owned(j_scoped_favicon_callback)); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_service->GetRawFaviconForPageURL( 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(ConvertJavaStringToUTF16(env, j_page_url)), 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<int>(j_icon_types), 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<int>(j_desired_size_in_pixel), 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_runner, 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancelable_task_tracker_.get()); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FaviconHelper::GetLargestRawFaviconForUrl( 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) JNIEnv* env, 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject obj, 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject j_profile, 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jstring j_page_url, 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jintArray j_icon_types, 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jint j_min_size_threshold_px, 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jobject j_favicon_image_callback) { 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(profile); 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!profile) 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile, Profile::EXPLICIT_ACCESS); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(favicon_service); 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!favicon_service) 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<int> icon_types; 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::android::JavaIntArrayToIntVector(env, j_icon_types, &icon_types); 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new ScopedJavaGlobalRef<jobject>(); 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) j_scoped_favicon_callback->Reset(env, j_favicon_image_callback); 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapCallback callback_runner = 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&OnFaviconRawBitmapResultAvailable, 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Owned(j_scoped_favicon_callback)); 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_service->GetLargestRawFaviconForPageURL( 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL(ConvertJavaStringToUTF16(env, j_page_url)), 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) icon_types, 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<int>(j_min_size_threshold_px), 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_runner, 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cancelable_task_tracker_.get()); 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ScopedJavaLocalRef<jobject> FaviconHelper::GetSyncedFaviconImageForURL( 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env, 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject obj, 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jobject jprofile, 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) jstring j_page_url) { 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(profile); 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string page_url = ConvertJavaStringToUTF8(env, j_page_url); 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService* sync_service = 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(sync_service); 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> favicon_png; 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_sync::OpenTabsUIDelegate* open_tabs = 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_service->GetOpenTabsUIDelegate(); 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(open_tabs); 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!open_tabs->GetSyncedFaviconForPageURL(page_url, &favicon_png)) 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ScopedJavaLocalRef<jobject>(); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Convert favicon_image_result to java objects. 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Image favicon_image = gfx::Image::CreateFrom1xPNGBytes(favicon_png); 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SkBitmap favicon_bitmap = favicon_image.AsBitmap(); 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedJavaLocalRef<jobject> j_favicon_bitmap; 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (favicon_bitmap.isNull()) 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ScopedJavaLocalRef<jobject>(); 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ConvertToJavaBitmap(&favicon_bitmap); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)FaviconHelper::~FaviconHelper() {} 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static jint GetDominantColorForBitmap(JNIEnv* env, 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) jclass clazz, 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) jobject bitmap) { 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!bitmap) 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return 0; 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::JavaBitmap bitmap_lock(bitmap); 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(bitmap_lock); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return color_utils::CalculateKMeanColorOfBitmap(skbitmap); 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool FaviconHelper::RegisterFaviconHelper(JNIEnv* env) { 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RegisterNativesImpl(env); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 228