favicon_helper.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved. 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// found in the LICENSE file. 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/android/favicon_helper.h" 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <jni.h> 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/android/jni_android.h" 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/android/jni_array.h" 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/android/jni_string.h" 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/android/scoped_java_ref.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/bind.h" 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/strings/string_util.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "base/strings/utf_string_conversions.h" 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/favicon/favicon_service.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/favicon/favicon_service_factory.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/profiles/profile.h" 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/profiles/profile_android.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/sync/open_tabs_ui_delegate.h" 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/sync/profile_sync_service.h" 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/sync/profile_sync_service_factory.h" 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "chrome/browser/sync/profile_sync_service_factory.h" 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "jni/FaviconHelper_jni.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "third_party/skia/include/core/SkBitmap.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "ui/gfx/android/java_bitmap.h" 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "ui/gfx/codec/png_codec.h" 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "ui/gfx/color_analysis.h" 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "ui/gfx/color_utils.h" 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::ScopedJavaGlobalRef; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::ScopedJavaLocalRef; 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::AttachCurrentThread; 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::ConvertJavaStringToUTF16; 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::ConvertJavaStringToUTF8; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing base::android::ConvertUTF8ToJavaString; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace { 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid OnLocalFaviconAvailable( 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaGlobalRef<jobject>* j_favicon_image_callback, 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const favicon_base::FaviconImageResult& favicon_image_result) { 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JNIEnv* env = AttachCurrentThread(); 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Convert favicon_image_result to java objects. 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaLocalRef<jstring> j_icon_url = 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ConvertUTF8ToJavaString(env, favicon_image_result.icon_url.spec()); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkBitmap favicon_bitmap = favicon_image_result.image.AsBitmap(); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaLocalRef<jobject> j_favicon_bitmap; 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!favicon_bitmap.isNull()) 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Call java side OnLocalFaviconAvailable method. 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Java_FaviconImageCallback_onFaviconAvailable(env, 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_image_callback->obj(), 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_bitmap.obj(), 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_icon_url.obj()); 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid OnFaviconRawBitmapResultAvailable( 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaGlobalRef<jobject>* j_favicon_image_callback, 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const favicon_base::FaviconRawBitmapResult& favicon_bitmap_result) { 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JNIEnv* env = AttachCurrentThread(); 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Convert favicon_image_result to java objects. 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaLocalRef<jstring> j_icon_url = 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ConvertUTF8ToJavaString(env, favicon_bitmap_result.icon_url.spec()); 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkBitmap favicon_bitmap; 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (favicon_bitmap_result.is_valid()) { 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gfx::PNGCodec::Decode(favicon_bitmap_result.bitmap_data->front(), 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project favicon_bitmap_result.bitmap_data->size(), 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &favicon_bitmap); 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaLocalRef<jobject> j_favicon_bitmap; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!favicon_bitmap.isNull()) 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_bitmap = gfx::ConvertToJavaBitmap(&favicon_bitmap); 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Call java side OnLocalFaviconAvailable method. 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Java_FaviconImageCallback_onFaviconAvailable(env, 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_image_callback->obj(), 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_favicon_bitmap.obj(), 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_icon_url.obj()); 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} // namespace 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic jlong Init(JNIEnv* env, jclass clazz) { 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return reinterpret_cast<intptr_t>(new FaviconHelper()); 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFaviconHelper::FaviconHelper() { 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cancelable_task_tracker_.reset(new base::CancelableTaskTracker()); 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid FaviconHelper::Destroy(JNIEnv* env, jobject obj) { 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delete this; 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectjboolean FaviconHelper::GetLocalFaviconImageForURL( 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JNIEnv* env, 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject obj, 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject j_profile, 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jstring j_page_url, 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jint j_icon_types, 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jint j_desired_size_in_dip, 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject j_favicon_image_callback) { 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(profile); 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!profile) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project profile, Profile::EXPLICIT_ACCESS); 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(favicon_service); 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!favicon_service) 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FaviconService::FaviconForPageURLParams params( 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project GURL(ConvertJavaStringToUTF16(env, j_page_url)), 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static_cast<int>(j_icon_types), 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static_cast<int>(j_desired_size_in_dip)); 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project new ScopedJavaGlobalRef<jobject>(); 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_scoped_favicon_callback->Reset(env, j_favicon_image_callback); 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project favicon_base::FaviconImageCallback callback_runner = base::Bind( 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &OnLocalFaviconAvailable, base::Owned(j_scoped_favicon_callback)); 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project favicon_service->GetFaviconImageForPageURL( 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params, callback_runner, 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cancelable_task_tracker_.get()); 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid FaviconHelper::GetLargestRawFaviconForUrl( 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JNIEnv* env, 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject obj, 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject j_profile, 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jstring j_page_url, 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jintArray j_icon_types, 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jint j_min_size_threshold_px, 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject j_favicon_image_callback) { 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); 147aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner DCHECK(profile); 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!profile) 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project profile, Profile::EXPLICIT_ACCESS); 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(favicon_service); 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!favicon_service) 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::vector<int> icon_types; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base::android::JavaIntArrayToIntVector(env, j_icon_types, &icon_types); 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback = 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project new ScopedJavaGlobalRef<jobject>(); 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project j_scoped_favicon_callback->Reset(env, j_favicon_image_callback); 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project favicon_base::FaviconRawBitmapCallback callback_runner = 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base::Bind(&OnFaviconRawBitmapResultAvailable, 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base::Owned(j_scoped_favicon_callback)); 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project favicon_service->GetLargestRawFaviconForPageURL( 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project profile, 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project GURL(ConvertJavaStringToUTF16(env, j_page_url)), 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_types, 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static_cast<int>(j_min_size_threshold_px), 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project callback_runner, 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cancelable_task_tracker_.get()); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectScopedJavaLocalRef<jobject> FaviconHelper::GetSyncedFaviconImageForURL( 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project JNIEnv* env, 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject obj, 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject jprofile, 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jstring j_page_url) { 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile); 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(profile); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string page_url = ConvertJavaStringToUTF8(env, j_page_url); 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProfileSyncService* sync_service = 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile); 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(sync_service); 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project scoped_refptr<base::RefCountedMemory> favicon_png; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project browser_sync::OpenTabsUIDelegate* open_tabs = 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sync_service->GetOpenTabsUIDelegate(); 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DCHECK(open_tabs); 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!open_tabs->GetSyncedFaviconForPageURL(page_url, &favicon_png)) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ScopedJavaLocalRef<jobject>(); 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Convert favicon_image_result to java objects. 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gfx::Image favicon_image = gfx::Image::CreateFrom1xPNGBytes(favicon_png); 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkBitmap favicon_bitmap = favicon_image.AsBitmap(); 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ScopedJavaLocalRef<jobject> j_favicon_bitmap; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (favicon_bitmap.isNull()) 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ScopedJavaLocalRef<jobject>(); 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return gfx::ConvertToJavaBitmap(&favicon_bitmap); 207aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner} 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFaviconHelper::~FaviconHelper() {} 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic jint GetDominantColorForBitmap(JNIEnv* env, 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jclass clazz, 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jobject bitmap) { 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!bitmap) 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gfx::JavaBitmap bitmap_lock(bitmap); 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(bitmap_lock); 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return color_utils::CalculateKMeanColorOfBitmap(skbitmap); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// static 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool FaviconHelper::RegisterFaviconHelper(JNIEnv* env) { 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RegisterNativesImpl(env); 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project