favicon_helper.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/android/favicon_helper.h"
6
7#include <jni.h>
8
9#include "base/android/jni_android.h"
10#include "base/android/jni_string.h"
11#include "base/android/scoped_java_ref.h"
12#include "base/bind.h"
13#include "chrome/browser/favicon/favicon_service.h"
14#include "chrome/browser/favicon/favicon_service_factory.h"
15#include "chrome/browser/profiles/profile.h"
16#include "chrome/browser/profiles/profile_android.h"
17#include "jni/FaviconHelper_jni.h"
18#include "third_party/skia/include/core/SkBitmap.h"
19#include "ui/gfx/android/java_bitmap.h"
20
21using base::android::ScopedJavaGlobalRef;
22using base::android::ScopedJavaLocalRef;
23using base::android::AttachCurrentThread;
24using base::android::ConvertJavaStringToUTF16;
25using base::android::ConvertUTF8ToJavaString;
26using base::android::MethodID;
27
28namespace {
29
30void FaviconImageCallback(
31    ScopedJavaGlobalRef<jobject>* java_favicon_image_callback,
32    const chrome::FaviconImageResult& favicon_image_result) {
33  JNIEnv* env = AttachCurrentThread();
34
35  // Convert favicon_image_result to java objects.
36  ScopedJavaLocalRef<jstring> java_icon_url = ConvertUTF8ToJavaString(
37      env, favicon_image_result.icon_url.spec());
38  SkBitmap favicon_bitmap = favicon_image_result.image.AsBitmap();
39  ScopedJavaLocalRef<jobject> java_favicon_bitmap = gfx::ConvertToJavaBitmap(
40      &favicon_bitmap);
41
42  // Call java side FaviconImageCallback method.
43  Java_FaviconImageCallback_onFaviconAvailable(
44      env, java_favicon_image_callback->obj(), java_favicon_bitmap.obj(),
45      java_icon_url.obj());
46}
47
48}  // namespace
49
50static jint Init(JNIEnv* env, jclass clazz) {
51  return reinterpret_cast<jint>(new FaviconHelper());
52}
53
54FaviconHelper::FaviconHelper() {
55  cancelable_task_tracker_.reset(new CancelableTaskTracker());
56}
57
58void FaviconHelper::Destroy(JNIEnv* env, jobject obj) {
59  delete this;
60}
61
62jboolean FaviconHelper::GetFaviconImageForURL(
63    JNIEnv* env, jobject obj, jobject jprofile, jstring page_url,
64    jint icon_types, jint desired_size_in_dip,
65    jobject java_favicon_image_callback) {
66  Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
67  DCHECK(profile);
68  if (!profile)
69    return false;
70
71  FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
72      profile, Profile::EXPLICIT_ACCESS);
73  DCHECK(favicon_service);
74  if (!favicon_service)
75    return false;
76
77  FaviconService::FaviconForURLParams params(
78      profile, GURL(ConvertJavaStringToUTF16(env, page_url)),
79      static_cast<int>(icon_types), static_cast<int>(desired_size_in_dip));
80
81  ScopedJavaGlobalRef<jobject>* j_scoped_favicon_callback =
82      new ScopedJavaGlobalRef<jobject>();
83  j_scoped_favicon_callback->Reset(env, java_favicon_image_callback);
84
85  FaviconService::FaviconImageCallback callback_runner = base::Bind(
86      &FaviconImageCallback, base::Owned(j_scoped_favicon_callback));
87
88  favicon_service->GetFaviconImageForURL(
89      params, callback_runner,
90      cancelable_task_tracker_.get());
91
92  return true;
93}
94
95FaviconHelper::~FaviconHelper() {
96}
97
98// static
99bool FaviconHelper::RegisterFaviconHelper(JNIEnv* env) {
100  return RegisterNativesImpl(env);
101}
102