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