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